Ну, это было достаточно интересно для меня, чтобы немного поэкспериментировать, и я прочитал 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
, по умолчанию используется глобальное имя pprint
, которое является модулем.
В то время как в main()
сначала используется ключевое слово global
, поэтому все ссылки на pprint
в рамках метода main()
будут относиться к global
имени 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 *) и осведомленность об импорте в импортированных модулях - имеет значение.
person
JV.
schedule
01.01.2009