2017-02-27 109 views
3

例如,我有一個函數對數據做了一些事情,並將一個名稱作爲可選參數。如果名稱未提供,我想調用另一個參數來創建名稱。所以,替代品似乎不是可以/ pythonic將另一個函數作爲可選參數調用嗎?

def do_something(data, name=get_name()): 
    ... 

def do_something(data, name=None): 
    if name is None: 
     name=get_name() 
    ... 

第一個似乎更給我,但我失去的東西嗎?

+10

是的:你錯過了'get_name'只會被調用一次的事實。見http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+0

當然,這可能是你想要的...... –

+0

你可以稍微縮短第二個例子的名字= name或get_name()'。但丹尼爾是對的 - 第一個例子冒着引入非常微妙的錯誤的風險。 – abought

回答

4

這不是一回事。

get_name()在第一種情況的函數定義中被評估,而在第二種情況下被動態地評估。

有,你不能使用第一種方法的情況下,無論如何,使用方法調用的返回時像(self.method()

所以堅持到了第二個版本。我不知道它是不是pythonic,但至少這是一個很好的配方,它的工作原理。

0

我會寫:

def do_something(data, func=get_name): 
    func() 

你傳遞給函數以後調用它。這與python中的函數是一對一的東西是一致的,因此,是安全的

+0

這假設調用者應該爲這個參數傳遞一個函數,這不是OP正在做的事情。但對於其中一個應該將函數傳遞給函數的其他情況,這是一個很好的解決方案。 – SethMMorton

+0

對。然後,我需要如果func == get_name:func = func()在調用func之前,這看起來很有趣。我更喜歡OP的第二個選項。 – jnsod

相關問題