2017-08-16 83 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()