Когда я вызываю execfile без передачи аргументов globals или localals, он создает объекты в текущем пространстве имен, но если я вызываю execfile и указываю dict для globals (и / или locals), он создает объекты в пространстве имен __builtin__
.
Возьмите следующий пример:
# exec.py
def myfunc():
print 'myfunc created in %s namespace' % __name__
exec.py execfile'd из main.py следующим образом.
# main.py
print 'execfile in global namespace:'
execfile('exec.py')
myfunc()
print
print 'execfile in custom namespace:'
d = {}
execfile('exec.py', d)
d['myfunc']()
когда я запускаю main.py из командной строки, я получаю следующий вывод.
execfile in global namespace:
myfunc created in __main__ namespace
execfile in custom namespace:
myfunc created in __builtin__ namespace
Почему он запускается в __builtin__
пространстве имен во втором случае?
Кроме того, если я затем пытаюсь запустить myfunc из __builtins__
, я получаю AttributeError. (Это то, что, я надеюсь, произойдет, но тогда почему __name__
установлено на __builtin__
?)
>>> __builtins__.myfunc()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'myfunc'
Может кто-нибудь объяснить это поведение?
Спасибо