2010-08-17 2 views
3

Допустим, у меня есть эти файлы:питон пакет импортируются автоматически при импорте глобального из модуля

- package1/ 
    - __init__.py 
    - package2/ 
    - __init__.py 
    - module1.py 

содержания package1/__init__.py:

from package2.module1 import var1 
print package2 

Пустой package1/package2/__init__.py

Содержание package1/package2/module1.py:

var1 = 123 

Вопрос в том, почему пакет2 будет импортирован? Запуск pylint против package1/__init__.py на самом деле даст ошибку Неопределенная переменная 'package2', но код работает.

ответ

1

При импорте модуля из пакета пакет всегда импортируется (загружается, если его еще нет в sys.modules), что может иметь побочный эффект связывания имени пакета в модуле импорта, хотя это не (зависит от реализации и версии Python).

И, импортируя что-то «изнутри модуля» (практика, которую я лично ненавижу, но это еще одна проблема), необходимо также обеспечить загрузку модуля (если он уже находится в sys.modules, его, разумеется, не нужно снова загружать , но если это не так, он должен быть загружен и помещен в sys.modules).

Оба эти поведения (гарантированные части ;-) все о «целостности» пакетов и модулей: когда вы пишете модуль вы можете быть уверены, что, даже если кто-то ошибочно пытается выбрать, какие биты для импорта, они будут влиять только на привязки имен в их собственном модуле, но ваш модуль всегда будет загружен в целом. И аналогично для кого-то, кто импортирует модуль из вашего пакета (совершенно нормальная практика, BTW): вы знаете ваш пакет __init__.py будет загружен первым, прежде чем что-нибудь случится. Это дает вам возможность сделать все необходимые проверки и инициализации, конечно!

+0

Спасибо за ответ. Вы знаете, где я могу найти дополнительную информацию о «побочном эффекте»? Я сделал поиск в Google, но не смог получить полезный результат. – sayap

+0

учебник по импорту по адресу http://effbot.org/zone/import-confusion.htm (не распространяется на пакеты и '__init __. Py'), официальный учебник по адресу http://docs.python.org/tutorial/modules.html. –

Смежные вопросы