29

Pythonで関数の引数が左から右に評価されると仮定しても安全ですか?

参照には、そのように起こると記載されていますが、おそらくこの順序を変更する方法があり、コードが壊れる可能性があります。

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

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

引数を順番に評価できることを理解しています。

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

しかし、それはあまりエレガントに見えないので、信頼できるのであれば最初の方法を好む.

4

2 に答える 2

45

リファレンス ドキュメントからの引用:

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

そうです、あなたはそれを当てにすることができます(1つの例外を除いて、以下を参照してください).

呼び出し((...)関数名など、プライマリーの後の部分) は単なる別の式primaryであり、呼び出しの引数は単なる追加式です。

: この規則には例外が 1 つあります。呼び出しで使用*expressionする場合 (イテラブルを拡張して追加の位置引数を形成するため)、この式はキーワード引数式の前に評価されます。

>>> from itertools import count
>>> def bar(n, r=(), c=count()): print(f'{next(c)}: bar({n!r})'); return r
...
>>> def foo(*args, **kwargs): pass
...
>>> foo(bar('a1'), spam=bar('a2'), *bar('varargs'), **bar('kwargs', {}))
0: bar('a1')
1: bar('varargs')
2: bar('a2')
3: bar('kwargs')

リンクされたドキュメントには次のように記載されています。

この結果、*expression構文は明示的なキーワード引数の後に表示される場合がありますが、キーワード引数の前に処理されます[.]

于 2013-07-30T13:37:58.707 に答える
14

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

これは、私が知る限り、カンマ区切りのリストに当てはまります。

>>> 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
于 2013-07-30T13:29:03.723 に答える