A causa delle regole di scoping di Python, tutte le variabili una volta inizializzate in un ambito sono disponibili successivamente. Poiché i condizionali non introducono un nuovo ambito, i costrutti in altri linguaggi (come l'inizializzazione di una variabile prima di tale condizione) non sono necessariamente necessari. Per esempio, potremmo avere:Qual è il modo pitone di inizializzazione della variabile condizionale?
def foo(optionalvar = None):
# some processing, resulting in...
message = get_message()
if optionalvar is not None:
# some other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
o, potremmo avere invece:
def foo(optionalvar = None):
if optionalvar is None:
# processing, resulting in...
message = get_message()
else:
# other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
Naturalmente, i get_message
e get_other_message
funzioni potrebbero essere molte righe di codice e sono sostanzialmente irrilevante (si può assumere che lo stato del programma dopo ogni percorso è lo stesso); l'obiettivo qui è rendere message
pronto per l'uso oltre questa sezione della funzione.
Ho visto il secondo costrutto utilizzato più volte in altre questioni, come ad esempio:
Quale costrutto sarebbe più accettabile?
Questo non dipende interamente dal fatto che si desideri 'get_message' per funzionare in modo condizionale o incondizionato? – delnan
L'idea qui non è la funzione da chiamare, ma piuttosto la costruzione di 'message': la funzione stessa è irrilevante. –
Sia che si tratti di una funzione o meno, l'unica differenza semantica è che si esegue la metà del codice incondizionatamente. Se fa la differenza, non ha molto senso discutere di stile. – delnan