2013-07-30 18 views
23

Czy można bezpiecznie założyć, że argumenty funkcji są oceniane od lewej do prawej w Pythonie?Czy można polegać na kolejności oceny argumentów funkcji Pythona?

Odniesienia stwierdza, że ​​tak się dzieje, ale być może jest jakiś sposób, aby zmienić tę kolejność, która może złamać mój kod.

Co chcę zrobić jest dodanie znacznika czasu dla wywołania funkcji:

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

Rozumiem, że mogę ocenić argumenty kolejno:

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

Ale wygląda mniej elegancki więc jestem Wolę pierwszy sposób, jeśli mogę na nim polegać.

+6

Jeśli odnośnik mówi tak i nie mówi wprost, że może się to zmienić w przyszłości, możesz na nim polegać. –

+0

'" jakiś sposób na zmianę tej kolejności "' Jak można to zmienić? (Funkcje nie mają możliwości wyboru sposobu oceny ich argumentów, są oceniane przed ich przekazaniem do funkcji) –

+1

W twoim przypadku użycia, kolejność oceniania nie ma znaczenia, chyba że 'f() 'jest długotrwałą funkcją. – Xaqq

Odpowiedz

14

Tak, Python zawsze analizuje argumenty funkcji od lewej do prawej.

Dotyczy to każdej liście oddzielone przecinkami ile wiem:

>>> 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

Niestety, przykłady nie mogą udowodnić, że nie jest to * niezdefiniowane zachowanie *. –

30

Cytując z reference documentation:

Python ocenia wyrażenia od lewej do prawej.

Tak, możesz na to liczyć.

+0

W rzeczywistości istnieje błąd w słowniku dosłownym, co jest sprzeczne z tą specyfikacją. Zobacz http://bugs.python.org/issue11205. – nymk

+4

@nymk: Tak, i dlatego jest to błąd. –

+8

To jest lepsza odpowiedź niż druga, wskazując, gdzie można ją znaleźć w odnośniku do języka. Drugi pokazuje, że tak jest, ale nie udowadnia, że ​​zawsze tak jest. – glglgl

Powiązane problemy