假设我有一个 Python 模块,里面有一些功能:
def sumvars(x, y, z):
s = x
s += y
s += z
return s
但有时我想获得一些中间计算的结果(例如,我可能有一个反转矩阵的函数,并且想知道作为中间步骤计算的行列式)。显然,如果这些计算已经在该函数中完成,我不想再次重做这些计算。
我的第一个想法是返回一个字典:
def sumvars(x, y, z):
d = {}
s = x
d['first_step'] = s
s += y
d['second_step'] = s
s += z
d['final'] = s
return d
但我不记得 numpy 或 scipy 中有任何返回指令的函数,所以这似乎不是一个好主意。 (为什么?)通常我总是必须键入 sumvars(x,y,z)['final']
以获得默认返回值......
我看到的另一个选项是创建全局变量,但在我的模块中有一堆全局变量似乎是错误的,我需要记住它们的名称,而且不附加到函数本身看起来是一个糟糕的设计选择。
对于这种情况,正确的功能设计是什么?
最佳答案
通常,当您有两种不同的方式返回数据时,请继续创建两个不同的函数。毕竟,“扁平比嵌套好”。只需让一个调用另一个,这样您就不会重复自己。
例如,在标准库中,urllib.parse
有parse_qs
(它返回一个dict
)和parse_qsl
(返回一个列表
)。 parse_qs
然后调用另一个:
def parse_qs(...):
parsed_result = {}
pairs = parse_qsl(qs, keep_blank_values, strict_parsing,
encoding=encoding, errors=errors)
for name, value in pairs:
if name in parsed_result:
parsed_result[name].append(value)
else:
parsed_result[name] = [value]
return parsed_result
非常简单。所以在你的例子中似乎很好
def sumvars(x, y, z):
return sumvars_with_intermediates(x, y, z).final
def sumvars_with_intermediates(x, y, z):
...
return my_namedtuple(final, first_step, second_step)
(我喜欢从我的 API 返回 namedtuple
而不是 dict
,它更漂亮)
另一个明显的例子是在re
中:re.findall
是它自己的函数,而不是一些search
的配置标志。
现在,标准库是一个庞大的东西,由许多作者创建,因此您会找到每个示例的反例。不过,您会更频繁地看到上述模式,而不是一个接受某些配置标志的综合函数,而且我发现它更具可读性。
关于python - 从 Python 中的函数返回中间结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22033415/