函数调用作为默认函数参数

时间:2017-08-16 16:04:33

标签: python python-3.x

具有

# example.py

def foo(arg=bar()):
        pass
即使使用bar

也会执行from example import foo

我记得很久以前我看过类似的东西:

# example.py

def foo(arg=lambda: bar()):
        pass

但我不确定它是不是最好的方式,现在,当我遇到这种情况时,我无法找到有关如何处理此行为的任何信息。

在python中将函数调用作为默认函数参数的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

这是最恐怖的方式:

def foo(arg=None):
    if arg is None:
        arg = bar()
    ...

如果您希望函数bar只被调用一次,并且您不希望在导入时调用它,那么您将必须在某处维护该状态。也许是在一个可调用的类中:

class Foo:

    def __init__(self):
        self.default_arg = None

    def __call__(self, arg=None):
        if arg is None:
            if self.default_arg is None:
                self.default_arg = bar()
            arg = self.default_arg
        ...

foo = Foo()