2017-08-02 84 views
0

我已經開始探索,但對於我的詳細信息無能爲力。我正在寫一個函數,使用默認值一個必需的和兩個可選參數,其中一個必須是一個元組:定義並使用一個元組作爲默認參數

def real_titlecase(lineString, delimiter = ' ', no_caps = do_not_cap): 

我想no_caps參數元組爲默認值,如果沒有被傳遞給do_not_cap。我的問題是,我想在函數內部定義do_not_cap,它包含約五十項:

do_not_cap = ('A','a','AN','An','an','THE','The','the', . . .) 

我曾試圖定義do_not_cap作爲高清功能的頂部的文檔字符串下的第一個項目,但我得到:

NameError: name 'do_not_cap' is not defined 

當我調用該函數。我假設python在頭文件中遇到了do_not_cap,並且從一捆乾草中不知道它,因爲它還沒有被定義。爲了便於閱讀,我真的不想在頭文件中定義該元組,我希望它封裝在函數中,以便它可以正常工作爲默認值。

那麼我該如何做到這一點?

謝謝!

回答

1

函數的默認值需要在定義函數時定義。您不能使用僅在函數運行時創建的值,這太遲了。

有兩種可能的解決方案。一個是(之前只是,也許)來定義的默認值的元組的功能之外:如果你想勸阻元組的其他用途

do_not_cap = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...) 

def real_titlecase(lineString, delimiter=' ', no_caps=do_not_cap): 
    ... 

(例如,你不希望它的名字成爲其中的一部分您的API),您可能想要使用以下劃線開頭的「私人」名稱(例如_do_not_cap而不是do_not_cap)。

另一種選擇是使用特殊的哨兵值(如None)作爲默認值。在函數的頂部,您可以檢查標記,並在所需的元組中替換它,如果看到的話。您需要選擇一個不會成爲用戶提供的有效參數的標記。 None適用於您的示例功能,但在其他情況下,如果None可能是用戶傳入的有意義的參數,則可能需要使用不同的標記。

def real_titlecase(lineString, delimiter=' ', no_caps=None): 
    if no_caps is None: 
     no_caps = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...) 
    ... 
+0

使用哨兵工作完美。任何人都不可能通過「無」 - 如果他們想要默認行爲,他們會放棄參數。至少這就是文檔串會說的。 –

相關問題