将函数输入的默认值设置为等于 Python 中的另一个输入
Posted
技术标签:
【中文标题】将函数输入的默认值设置为等于 Python 中的另一个输入【英文标题】:Setting the default value of a function input to equal another input in Python 【发布时间】:2011-04-01 20:28:20 【问题描述】:考虑以下函数,它在 Python 中不起作用,但我将用它来解释我需要做什么。
def exampleFunction(a, b, c = a):
...function body...
也就是说,我想为变量 c
分配与变量 a
相同的值,除非指定了替代值。上面的代码在 python 中不起作用。有没有办法做到这一点?
【问题讨论】:
【参考方案1】:def example(a, b, c=None):
if c is None:
c = a
...
关键字参数的默认值不能是变量(如果是,则在定义函数时将其转换为固定值。)通常用于将参数传递给主函数:
def main(argv=None):
if argv is None:
argv = sys.argv
如果None
可能是一个有效值,则解决方案是使用*args
/**kwargs
魔法,如carl 的回答,或使用哨兵对象。执行此操作的库包括 attrs 和 Marshmallow,在我看来它更干净而且可能更快。
missing = object()
def example(a, b, c=missing):
if c is missing:
c = a
...
唯一c is missing
为真的方式是c
是完全你在那里创建的虚拟对象。
【讨论】:
没错。一旦定义了函数,默认参数就会一成不变。 @delnan 这就是为什么不能像def(x=2,y)
那样在最后提供非默认设置参数的原因,而是我必须将函数定义为def(y, x=2)
?【参考方案2】:
这种通用模式可能是最好的和最易读的:
def exampleFunction(a, b, c = None):
if c is None:
c = a
...
您必须注意None
不是c
的有效状态。
如果您想支持“无”值,您可以执行以下操作:
def example(a, b, *args, **kwargs):
if 'c' in kwargs:
c = kwargs['c']
elif len(args) > 0:
c = args[0]
else:
c = a
【讨论】:
+1 提到None
不能成为 c
的有效状态,以便 c=None
技巧起作用。【参考方案3】:
一种方法类似于:
def foo(a, b, c=None):
c = a if c is None else c
# do something
【讨论】:
以上是关于将函数输入的默认值设置为等于 Python 中的另一个输入的主要内容,如果未能解决你的问题,请参考以下文章
decode(A.type, 0, 1, 0) 这个sql函数,是啥意思? 谢谢解答
如何从widget的函数返回值,并将其传递给Tkinter,Python中的另一个小部件的函数