2012-01-17 22 views
8

perche semplice funzione:funzione con argomenti predefiniti dipendenti

def fun(x, y, param1=10, param2=param1/3): 
    do something 

Dove non dovrebbero essere tenuti param1 e param2 ma può essere impostato dall'utente. Se param2 non è impostato, il valore dipende in qualche modo da param1.

Sopra esempio alzerà NameError: name 'param1' is not defined

C'è un modo per fare questo tipo di incarico in Python?

risposta

12

Un modo è quello di emulare questo all'interno della funzione:

def fun(x, y, param1=10, param2=None): 
    if param2 is None: 
     param2 = param1/3 
    # do something 

Se param2=None è un input valido in fun(), quanto segue potrebbe essere un'alternativa migliore:

default = object() 

def fun(x, y, param1=10, param2=default): 
    if param2 is default: 
     param2 = param1/3 
    # do something 

(Essendo stato a guardare questo secondo esempio per alcuni minuti, in realtà mi piace molto la sintassi is default.)

Il motivo dell'origine la versione inal non funziona è che i valori predefiniti sono calcolati e associati al tempo di definizione della funzione. Ciò significa che non puoi avere un valore predefinito che dipende da qualcosa che non è noto fino a quando non viene chiamata la funzione (nel tuo caso, il valore di param1).

+2

'default' potrebbe essere fuorviante,' not_set' potrebbe essere un nome migliore. Non è chiaro (per me) a colpo d'occhio che "default" non sia il valore predefinito in sé ma un segnaposto che segnala che dovrebbe essere usato un valore predefinito per "param2". – jfs

Problemi correlati