Ну, это было достаточно интересно для меня, чтобы немного поэкспериментировать, и я прочитал http://docs.python.org/reference/executionmodel.html
Потом немного повозился с вашим кодом, вот что я смог найти:
Код:
import pprint
def two():
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
print globals()['pprint']
def main():
if 'pprint' in globals():
print 'pprint is in globals()'
global pprint
print globals()['pprint']
pprint.pprint('Spam')
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
def three():
print globals()['pprint']
pprint.pprint('Spam')
if __name__ == '__main__':
two()
print('\n')
three()
print('\n')
main()
выход:
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Eggs'
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
pprint is in globals()
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
<function pprint at 0xb7d596f4>
'Eggs'
В методе two()
from pprint import pprint
, но не переопределяет имя pprint
в globals
, поскольку ключевое слово global
является , а не , используемым в области действия two()
.
В методе three()
, поскольку в локальной области нет объявления pprint
name, по умолчанию используется глобальное имя pprint
, являющееся модулем
Принимая во внимание, что в main()
сначала используется ключевое слово global
, поэтому все ссылки на pprint
в области действия метода main()
будут ссылаться на global
name pprint
, Который, как мы видим, вначале является модулем и переопределяется в global
namespace
методом, аналогичным from pprint import pprint
Хотя это может не отвечать на вопрос как таковой, но, тем не менее, я думаю, что это какой-то интересный факт.
=====================
Редактировать Еще одна интересная вещь.
Если у вас есть модуль, скажите:
mod1
from datetime import datetime
def foo():
print "bar"
и другой метод говорит:
mod2
import datetime
from mod1 import *
if __name__ == '__main__':
print datetime.datetime.now()
, что на первый взгляд кажется правильным, поскольку вы импортировали модуль datetime
в mod2
.
теперь, если вы попытаетесь запустить mod2 как скрипт, он выдаст ошибку:
Traceback (most recent call last):
File "mod2.py", line 5, in <module>
print datetime.datetime.now()
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
, поскольку второй импорт from mod2 import *
переопределил имя datetime
в пространстве имен, поэтому первый import datetime
больше не действителен.
Мораль: таким образом, порядок импорта, характер импорта (от x import *) и осведомленность об импорте в импортируемых модулях - имеет значение .