Гарантия порядка оценки в пределах литералов коллекции и аргументов функции - PullRequest
0 голосов
/ 13 июня 2019

В Python 3.6.1 все следующее, кажется, оценивает слева направо:

In [1]: counter = iter(range(100))

In [2]: [next(counter), next(counter)]
Out[2]: [0, 1]

In [3]: (next(counter), next(counter))
Out[3]: (2, 3)

In [4]: next(counter), next(counter)
Out[4]: (4, 5)

In [5]: {next(counter): next(counter),
   ...:  next(counter): next(counter)}
   ...:  
Out[5]: {6: 7, 8: 9}

In [6]: print(next(counter), next(counter))
10 11

Я заметил, что коллекции, такие как list, tuple и dict, а также аргументы функций, оценивают свои аргументы слева направо.

Гарантируется ли это поведение или это детали реализации? Я предполагаю, что это должно быть частью языкового стандарта, потому что иначе программы будут оцениваться по-разному в зависимости от переводчика.

1 Ответ

1 голос
/ 13 июня 2019

Да, это поведение является частью языкового стандарта. См. Раздел Порядок оценки в документации:

6,15. Оценочный заказ

Python оценивает выражения слева направо. Обратите внимание, что в то время как оценивая назначение, правая часть оценивается до левая сторона.

В следующих строках выражения будут оцениваться в арифметический порядок их суффиксов:

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

В связанном вопросе, касающемся только литералов dict, один ответ указывает, что реальное поведение в CPython было некорректным для dict начиная с версии 2.5 и было исправлено в версия 3.5 .

...