Почему это "from bar import *" загрязняет мое пространство имен именем, не определенным в импортированном модуле? - PullRequest
0 голосов
/ 17 января 2019

Мне показалось, что я понял, что "импорт *" сделал и его потенциальные опасности , но, очевидно, нет.

У меня есть:

foo.py:

from datetime import datetime
from bar import *
print(datetime.now())

bar.py:

import datetime

Результат выполнения foo.py является исключением:

AttributeError: модуль «datetime» не имеет атрибута «now»

datetime - это модуль, но datetime.datetime - это тип. from datetime import datetime делает так, что datetime в foo.py ссылается на тип, но последующий from bar import * как-то заставляет его снова обращаться к модулю.

Удаление from bar import * исключает исключение.

Но почему from bar import * загрязняет мое пространство имен модулем datetime? datetime - это модуль, импортированный в bar, но он там не определен. Чего мне не хватает?

1 Ответ

0 голосов
/ 17 января 2019

Модуль bar определяет имя datetime. Заявление

import datetime

создает переменную уровня модуля datetime в модуле bar и привязывает переменную к модулю datetime. import * подбирает это имя так же, как оно подбирает другие имена.

import * не заботится о том, где были созданы объекты. Неважно, что сам модуль datetime происходит из какого-то другого файла. * datetime имя существует в bar, поэтому имя импортируется.

...