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

pyt*_*had 5 python python-3.x

# example.py

def foo(arg=bar()):
        pass
Run Code Online (Sandbox Code Playgroud)

bar甚至会执行from example import foo.

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

# example.py

def foo(arg=lambda: bar()):
        pass
Run Code Online (Sandbox Code Playgroud)

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

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

wim*_*wim 9

这是最恐怖的方式:

def foo(arg=None):
    if arg is None:
        arg = bar()
    ...
Run Code Online (Sandbox Code Playgroud)

如果您希望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()
Run Code Online (Sandbox Code Playgroud)