Импорт модулей с точкой в python

#python #python-import

Вопрос:

Я читал https://www.python.org/dev/peps/pep-0008/#imports но я не нашел явного подтверждения.

Предполагая следующую структуру пакета:

 |-package1
|--|__init__.py
│--|module.py
 

Я хочу импортировать module.py внутрь __init__.py .

Интересно, есть ли какая-то семантическая разница между:

 from . import module
 

и

 from .module import *
 

предполагая, что я хочу импортировать все внутри module.py каждый раз package , когда загружается.

Комментарии:

1. Вы пробовали? Имело ли это какое-то значение?

2. Я не уверен, что вы подразумеваете под семантическая разница (потому что два высказывания, очевидно, семантически разные), но если вы имеете в виду, если у них есть какие-разному влияют на то, как вы продолжите пользоваться библиотекой оттуда, то да, потому что пространство имен будет по-другому, то есть как ссылки на различные объекты module .

3. @mapf Очевидно, что эти два утверждения синтаксически различны. Я спрашивал, отличаются ли они также семантически . Ответ-да.

Ответ №1:

Большая разница между этими двумя вещами заключается в том, что в первом случае имена сохраняются в пространстве имен, во module втором примере все имена импортируются из module текущего пространства имен.

Предположим module.py , определяет функцию foo .

 from . import module
module.foo()
 

против.

 from .module import *
foo()
 

Но что касается того, как система импорта загружает модуль/пакет, ничего не меняется. Оба оператора импорта адресуются точно к одному и тому же модулю и только к этому модулю. Способ доступа к импортированному модулю по имени зависит от инструкции импорта, как показано выше.

Кроме того, PEP8-это просто руководство по стилю. PEP328 расскажет вам больше об относительном импорте