2017-08-16 65 views
5

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

# example.py 

def foo(arg=bar()): 
     pass 

将执行bar甚至from example import foo

我记得很久以前我看到的东西,如:

# example.py 

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

,但我不知道这是否是最好的方式,现在,当我坚持这一点,我无法找到任何信息关于如何处理这种行为。

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

+0

在哪种情况下,你想绑定到'arg'的函数被调用?何时输入'foo'?当'foo'被调用?其他时间? –

+2

@StevenRumbalski,当它被调用。我发现wim回答了我正在寻找的东西。 – pythad

回答

9

这是最Python的方式:

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()