2013-07-30 18 views
23

È sicuro assumere che gli argomenti di funzione sono valutati da sinistra a destra in Python?È sicuro affidarsi all'ordine di valutazione degli argomenti della funzione Python?

Il riferimento indica che succede in questo modo ma forse c'è un modo per cambiare questo ordine che potrebbe infrangere il mio codice.

Quello che voglio fare è quello di aggiungere il tempo bollo per chiamata di funzione:

l = [] 
l.append(f(), time.time()) 

ho capito che posso valutare gli argomenti in sequenza:

l = [] 
res = f() 
t = time.time() 
l.append(res, t) 

ma sembra meno elegante così ho' Preferisco il primo modo se posso fidarmi di esso.

+6

Se il riferimento lo dice e non dice esplicitamente che questo potrebbe cambiare in futuro, allora puoi fare affidamento su di esso. –

+0

'" un modo per cambiare questo ordine "' Come potrebbe essere cambiato? (Le funzioni non possono scegliere come valutare i loro argomenti, vengono valutate prima di passare alla funzione) –

+1

Nel tuo caso d'uso, l'ordine di valutazione non sembra avere importanza, tranne se 'f() 'è una funzione di lunga durata. – Xaqq

risposta

14

Sì, Python valuta sempre gli argomenti della funzione da sinistra a destra.

Questo vale per qualsiasi virgola separato per quanto ne so:

>>> from __future__ import print_function 
>>> def f(x, y): pass 
... 
>>> f(print(1), print(2)) 
1 
2 
>>> [print(1), print(2)] 
1 
2 
[None, None] 
>>> {1:print(1), 2:print(2)} 
1 
2 
{1: None, 2: None} 
>>> def f(x=print(1), y=print(2)): pass 
... 
1 
2 
+2

Sfortunatamente, gli esempi non possono dimostrare che questo non è * comportamento non definito *. –

30

Citando dal reference documentation:

Python valuta le espressioni da sinistra a destra.

Quindi sì, potete contare su questo.

+0

In realtà, c'è un errore nel dizionario letterale, che è contro questa specifica. Vedi http://bugs.python.org/issue11205. – nymk

+4

@nymk: Sì, ed è per questo che è un bug. –

+8

Questa è una risposta migliore rispetto all'altra, che indica dove può essere trovata nella lingua di riferimento. L'altro mostra semplicemente che è così, ma non dimostra che si suppone che sia sempre così. – glglgl