21

考虑以下函数,它在 Python 中不起作用,但我将用它来解释我需要做什么。

def exampleFunction(a, b, c = a):
    ...function body...

也就是说,我想为变量分配与变量c相同的值a,除非指定了替代值。上面的代码在 python 中不起作用。有没有办法做到这一点?

4

3 回答 3

30
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 的答案,或使用sentinel object。这样做的库包括attrsMarshmallow,在我看来,它更干净,可能更快。

missing = object()

def example(a, b, c=missing):
    if c is missing:
        c = a
    ...

成为真的唯一方法就是成为你在那里创建的那个虚拟对象。c is missingc

于 2010-08-20T19:51:53.777 回答
17

这个通用模式可能是最好的和最易读的:

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
于 2010-08-20T19:52:55.357 回答
1

一种方法是:

def foo(a, b, c=None):
    c = a if c is None else c
    # do something
于 2010-08-20T19:52:36.120 回答