【发布时间】:2015-06-16 11:10:48
【问题描述】:
考虑一个带有默认参数的典型函数:
def f(accuracy=1e-3, nstep=10):
...
这是紧凑且易于理解的。但是,如果我们有另一个函数g 将调用f,并且我们想将g 的一些参数传递给f,该怎么办?这样做的自然方式是:
def g(accuracy=1e-3, nstep=10):
f(accuracy, nstep)
...
这种做事方式的问题是可选参数的默认值会重复。通常在像这样传播默认参数时,希望上层函数 (g) 中的默认值与下层函数 (f) 中的默认值相同,因此任何时候 f 中的默认值更改都需要遍历所有调用它并更新它们将传播到 f 的任何参数的默认值的函数。
另一种方法是使用占位符参数,并在函数内填充其值:
def f(accuracy=None, nstep=None):
if accuracy is None: accuracy = 1e-3
if nstep is None: nstep=10
...
def g(accuracy=None, nstep=None):
f(accuracy, nstep)
...
现在调用函数不需要知道f 的默认值是什么。但是f 接口现在有点繁琐,不太清晰。这是没有显式默认参数支持的语言中的典型方法,例如 fortran 或 javascript。但是,如果在 python 中以这种方式做所有事情,那么就会放弃该语言的大部分默认参数支持。
还有比这两个更好的方法吗?这样做的标准、pythonic 方式是什么?
【问题讨论】:
-
这个问题我已经问过自己很多次了。但这可能是[程序员[(programmers.stackexchange.com)的问题?我以为有一个 comp-sci 堆栈交换,但我现在找不到它。我迫不及待地想看看你会得到什么样的答案。
-
@MarkMikofski 您正在考虑 cs.stackexchange.com 虽然该网站更多地处理需要时髦希腊字母的问题,并且喜欢谈论 Big O。不过,这个问题,如果最好在 Stack Overflow 或 Programmers.SE 上询问。因为它在这里并且似乎没有收集主题选票,所以这里可能还可以。请注意,如果要迁移到 P.SE,答案将与该网站所需的答案样式不匹配。
-
@MarkMikofski 另一方面,如果问题主要是关于 Stack Overflow 的意见或过于宽泛的问题,那么它在 Programmers.SE 上可能同样适用。为此,您不妨阅读What goes on Programmers.SE? A guide for Stack Overflow,它试图帮助 Stack Overflow 用户了解 Programmers.SE 的范围并避免糟糕的迁移建议。
-
感谢 @MichaelT 让其他人看到 Choosing between Stack Overflow and Programmers Stack Exchange,我特别喜欢 > “经验法则:如果您坐在 IDE 前,请在 Stack Overflow 上询问。如果您是站着的在白板前,向程序员提问”
标签: python default argument-passing