В Python 2. * вы можете заставить работать такой код, победив обычную оптимизацию локальных систем:
>>> def g():
... exec 'pass'
... f()
... print(eggs)
Наличие оператора exec
приводит к тому, что Python 2 компилирует g
совершенно неоптимизированным образом, поэтому локальные данные находятся в dict, а не в массиве, как обычно. (Производительность может быть значительной).
Эта «де-оптимизация» не существует в Python 3, где exec
больше не является оператором (даже не ключевым словом, а просто функцией) - даже если поставить скобки после него, это не поможет ... :
>>> def x():
... exec('a=23')
... print(a)
...
>>> x()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in x
NameError: global name 'a' is not defined
>>>
То есть, даже exec
теперь не может "создавать локальные объекты", которые не были известны в def
(то есть, когда компилятор сделал свой проход, чтобы превратить тело функции в байт-код).
Лучше всего было бы сдаться. Во-вторых, лучше всего было бы, чтобы ваша f
функция вставляла новые имена в globals
- вызывающего, в конце концов, эти все еще являются диктатом.