2013-07-30 8 views
23

Pythonでは関数の引数が左から右に評価されると考えるのは安全でしょうか?Python関数の引数の評価順序に頼っても安全ですか?

このようなことが起こったと言われていますが、おそらくコードを壊す可能性のあるこの順序を変更する方法があります。

私は何をしたいことは、関数呼び出しのためのタイムスタンプを追加することです:

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

私は順次引数を評価することができることを理解する:

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

しかし、それはあまりエレガントに見えるので、私は」私がそれに頼ることができるならば、最初の方法が好きです。

+6

参考文献にそういったことが明示されていて、これが将来変更される可能性が明示されていない場合は、それに頼ることができます。 –

+0

''この順序を変える何らかの方法」 ''どうすれば変更できますか? (関数は引数の評価方法を選択しません。関数に渡される前に評価されます) –

+1

ユースケースでは、 'f() 'は長時間実行される関数です。 – Xaqq

答えて

14

はい、Pythonは常に関数の引数を左から右に評価します。

これは私の知る限りでは任意のカンマ区切りのリストのために行く:reference documentationから引用

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

残念ながら、例は*未定義の動作*ではないことを証明することはできません。 –

30

Pythonは左から右に式を評価します。

はい、あなたはそれを期待することができます。

+0

実際には、辞書のリテラルにはこの仕様に反するバグがあります。 http://bugs.python.org/issue11205を参照してください。 – nymk

+4

@nymk:うん、だからこそバグだよ。 –

+8

これは、他の言語よりも優れた答えです。言語リファレンスのどこにあるのかを指摘しています。他の人はそれがこの方法であることを示していますが、それは常にこのようになっているはずです。 – glglgl

関連する問題