Механизм импорта Python

У меня есть два связанных вопроса «импорт» Python. Они легко проверяются, но я хочу, чтобы ответы были языковыми, а не специфичными для реализации, и меня тоже интересует стиль / соглашение, поэтому я спрашиваю здесь.

1)

Если модуль A импортирует модуль B, а модуль B импортирует модуль C, может ли код в ссылочном модуле C C без явного импорта? Если это так, я исправлю, полагая, что это плохая практика?

2)

Если я импортирую модуль ABC, он также импортирует модули A и AB? Если да, то по соглашению лучше явно import A; import AB; import ABC import A; import AB; import ABC import A; import AB; import ABC ?

  • Pyspark Spark DataFrame - группировать и фильтровать столбцы в столбце типа карты
  • Потрясающее поведение закрытия в python
  • Как использовать Python virtualenv
  • Преобразование Z-балла (Z-значение, стандартная оценка) в p-значение для нормального распределения в Python
  • Как проверить, покинул ли пользователь приглашение 'input' или 'raw_input' пустым?
  • Многопроцессорность Python.Queue изменяет объекты
  • В чем разница между select_related и prefetch_related в Django ORM?
  • Развертывание статических ресурсов на герою с локальной машины - невозможно открыть файл «manage.py»: Нет такого файла или каталога
  • 2 Solutions collect form web for “Механизм импорта Python”

    Первое, что вы должны знать, это то, что язык Python НЕ является стандартом ISO. Это сильно отличается от C / C ++, и это означает, что нет правильного способа определения поведения языка. CPython может что-то сделать только потому, что он был закодирован таким образом, и Jython мог бы сделать наоборот.

    о ваших вопросах, помните, что «импорт» модуля представляет собой операцию из двух частей: сначала модуль загружается – если он никогда не был, например, если он недоступен в sys.modules, то имя привязано к этому модулю в локальном пространстве имен.

    следовательно:

    1) Да, вы можете ссылаться на все, что захотите, из модуля a, предоставляя правильное пространство имен, например, вам нужно будет сделать что-то вроде

    BCname = "something"

    И я думаю, что это очень редко делается в программах Python и может считаться плохой практикой, поскольку он заставляет «transitive dep» – если какая-то реализация модуля B реорганизуется и больше не зависит от C, он должен продолжать предлагать только модуль C для удовлетворения A deps.

    Конечно, установка __ все __ может предотвратить это, и хорошей практикой может быть посылка __ всего __ во все ваши модули и экспорт только символов, которые вы хотите быть действительно публичными.

    2) Да и нет. дела

     import abcd 

    выполняет первую фазу импорта (погрузка) во всех модулях, а вторая только на (и, рекурсивно, в b по отношению к c и т. д.), но все модули в цепочке должны ссылаться на полное пространство имен; после такого импорта вы можете сделать

     a.something absomething abcsomething 

    но вы не можете сделать

     c.something b.something 

    Я должен признать, что такое использование довольно редко встречается; Обычно я предпочитаю путь от импорта к модулю «импортировать что-то», и обычно вы просто спрашиваете, что вам нужно – такая вложенность не распространена в библиотеках, и ее использование не является общим.

    Много раз есть «внешние пакеты», которые просто используются для организации, которые содержат модули с классами. Очень вероятно, что a, b, c выше – это просто пакеты, а d – модуль, который действительно содержит классы, функции и другие объекты. Поэтому правильное использование:

     from abcd import name1, name2, name3 

    Надеюсь, это насытит ваше любопытство.

    Алан дал отличный ответ, но я хотел добавить, что для вашего вопроса 1 это зависит от того, что вы подразумеваете под «импортом».

    Если вы используете синтаксис from C import x , x становится доступным в пространстве имен B Если в A вы import B , у вас будет доступ к x из A как Bx .

    Это не такая уж плохая практика, как потенциально запутанная и более сложная отладка и т. Д., Поскольку вы не обязательно будете знать, откуда взялись объекты.

    Python - лучший язык программирования в мире.