Я хочу знать, как __future__
импорт взаимодействует с eval
и exec
(и compile
, я полагаю).
Эксперимент (с python 2) показывает, что импорт на уровне модуля __future__
влияет на код, выполняемый eval
и exec
:
from __future__ import print_function
print(1, end='!\n')
eval(r"print(2, end='!\n')")
exec r"print(3, end='!\n')"
Выход:
1!
2!
3!
Но в то же время код, выполняемый с помощью exec
, может выполнять собственный импорт __future__
, который влияет только на код локально:
print 1
exec r"from __future__ import print_function; print(2, end='!\n')"
print 3
exec r"print 4"
Выход:
1
2!
3
4
Но экспериментирование может только дать вам так далеко. Мои вопросы:
- Являются ли эти взаимодействия четко определенными и задокументированными?
- Есть ли способ отключить на уровне модуля
__future__
импорт в eval
, exec
и compile
?