Подтвердить что ты не робот

Python - абсолютный импорт для модуля в том же каталоге

У меня есть этот пакет:

mypackage/
    __init__.py
    a.py
    b.py

И я хочу импортировать вещи из модуля a в модуль b, имеет смысл писать в модуле b

from mypackage.a import *

или я должен просто использовать

from a import *

Оба варианта будут работать, мне просто интересно, что лучше (второй имеет смысл, потому что он на одном уровне, но я рассматриваю первый, чтобы избежать столкновений, например, если система запущена из папки, содержащей файл с именем a.py).

4b9b3361

Ответ 1

Вы можете безопасно использовать номер 2, потому что не должно быть никаких коллизий - вы всегда будете импортировать модуль из того же пакета, что и текущий. Обратите внимание, что если ваш модуль имеет то же имя, что и один из стандартных модулей библиотеки, он будет импортирован вместо стандартного. Из документация:

Когда импортируется модуль с именем spam, интерпретатор сначала ищет для встроенного модуля с этим именем. Если он не найден, он затем выполняет поиск для файла с именем spam.py в списке каталогов, заданных переменная sys.path. sys.path инициализируется из этих мест:

  •   
  • каталог, содержащий вход script (или текущий каталог).  
  • PYTHONPATH (список имен каталогов с тем же синтаксисом, что и  
  • переменная оболочки PATH).  
  • зависит от установки по умолчанию.  

После инициализации программы Python могут изменять sys.path. The каталог, содержащий запущенный script, помещается в начале пути поиска, впереди стандартного пути библиотеки. Это означает что скрипты в этом каталоге будут загружены вместо модулей одно и то же имя в каталоге библиотеки. Это ошибка, если замена предназначена. См. Раздел Стандартные модули для более информация.

Опция from mypackage.a import * может использоваться по причинам согласованности по всему проекту. В некоторых модулях вам все равно придется делать абсолютный импорт. Таким образом, вам не придется думать, находится ли модуль в одном пакете или нет, и просто использовать единый стиль во всем проекте. Кроме того, этот подход более надежный и предсказуемый.

Руководства по стилю Python не рекомендуют использовать относительный импорт:

Относительный импорт для внутрипакетного импорта сильно обескуражен. Всегда используйте абсолютный путь пакета для всех импорта. Даже сейчас, когда PEP 328 полностью реализован в Python 2.5, его стиль явного относительный импорт активно обескуражен; абсолютный импорт больше портативный и обычно более читаемый.

Так как python 2.5 был введен новый синтаксис для относительного импорта внутри пакета. Теперь вы можете . ссылаться на текущий модуль, а .. - на уровень выше 1 уровня.

from . import echo
from .. import formats
from ..filters import equalizer

Ответ 2

Вы должны использовать from mypackage.a import things, you, want.

Здесь есть два вопроса: основной - относительный абсолютный импорт, семантика которого изменена в Python 3 и может быть использована в Python 2.6 и 2.7 с использованием импорта __future__. Используя mypackage.a, вы гарантируете, что получите код, который вам действительно нужен, и он будет надежно работать с будущими версиями Python.

Во-вторых, вам следует избегать импорта *, поскольку он может потенциально маскировать другой код. Что делать, если файл a.py получил функцию под названием sum? Он молча переменил бы встроенный. Это особенно плохо при импорте собственного кода в другие модули, так как у вас могут быть повторные имена переменных или функций.

Следовательно, вы должны только импортировать определенные функции, которые вам нужны. Использование pyflakes на исходном коде затем предупредит вас, когда у вас появятся потенциальные конфликты.