将函数输入的默认值设置为等于 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中的另一个小部件的函数

如何获取复制到剪贴板的数据值并将其设置为android studio中的另一个值

python shell中的默认函数[重复]

当我尝试将函数的参数设置为默认值时出现意外错误