Я должен использовать 'импорт os.path', или 'импортируют OS'?

Согласно официальной документации, os.path модуль. Таким образом, каков предпочтительный способ импортировать его?

# Should I always import it explicitly?
import os.path

Или...

# Is importing os enough?
import os

НЕ отвечайте "на импорт os работы для меня". Я знаю, это работает на меня слишком прямо сейчас (с Python 2.6). То, что я хочу знать, является любой официальной рекомендацией об этой проблеме. Так, при ответе на этот вопрос отправьте ссылки.

132
задан CharlesB 25 February 2013 в 15:10
поделиться

4 ответа

os.path работает забавным образом. Похоже, что os должен быть пакетом с подмодулем path, но на самом деле os - это обычный модуль, который творит магию с sys.modules, чтобы внедрить os.path. Вот что происходит:

  • Когда Python запускается, он загружает кучу модулей в sys.modules. Они не привязаны к каким-либо именам в вашем сценарии, но вы можете получить доступ к уже созданным модулям, если импортируете их каким-либо образом.

    • sys.modules - это dict, в котором кэшируются модули. Когда вы импортируете модуль, если он уже был импортирован где-то, он получает экземпляр, хранящийся в sys.modules.
  • os входит в число модулей, которые загружаются при запуске Python. Он присваивает свой атрибут path модулю os-specific path.

  • Он внедряет sys.modules['os.path'] = path, так что вы можете сделать "import os.path", как будто это подмодуль.

Я склонен думать о os. path как модуль, который я хочу использовать, а не как вещь в модуле os, поэтому, даже если это не действительно подмодуль пакета под названием os, я импортирую его как будто он импортируется, и я всегда делаю import os.path. Это соответствует тому, как документирован os.path.


Кстати говоря, подобная структура приводит к тому, что многие программисты Python в начале своей карьеры путаются в модулях, пакетах и организации кода. Это происходит по двум причинам

  1. Если вы думаете о os как о пакете и знаете, что можете сделать import os и получить доступ к подмодулю os.path, вы можете удивиться позже, когда не сможете сделать import twisted и автоматически получить доступ к twisted.spread без его импорта.

  2. Смущает, что os.name - это обычная вещь, строка, а os.path - модуль. Я всегда структурирую свои пакеты с помощью пустых файлов __init__.py, чтобы на одном уровне у меня всегда был один тип вещей: модуль/пакет или другие вещи. Несколько крупных проектов Python используют этот подход, что, как правило, делает код более структурированным.

151
ответ дан 24 November 2019 в 00:11
поделиться

Интересно, что при импорте os.path будет импортирована вся os. попробуйте следующее в интерактивном запросе:

import os.path
dir(os)

Результат будет таким же, как если бы вы только что импортировали os. Это связано с тем, что os.path будет ссылаться на другой модуль в зависимости от того, какая у вас операционная система, поэтому python будет импортировать os, чтобы определить, какой модуль загружать для пути.

ссылка

В некоторых модулях указание import foo не будет открывать foo.bar , поэтому я предполагаю, что это действительно зависит от дизайна конкретного модуля.


В общем, простой импорт явных модулей, которые вам нужны, должен быть немного быстрее. На моем компьютере:

import os.path : 7.54285810068e-06 секунды

import os : 9.21904878972e-06 секунд

Эти времена достаточно близки, чтобы ими можно было пренебречь. Возможно, вашей программе потребуется использовать другие модули из os сейчас или позже, поэтому обычно имеет смысл просто пожертвовать двумя микросекундами и использовать import os , чтобы избежать этой ошибки на позднее время.Обычно я сторонник простого импорта ОС в целом, но могу понять, почему некоторые предпочли бы import os.path технически быть более эффективным и донести до читателей кода, что это единственная часть ] os модуль, который необходимо будет использовать. По сути, в моем понимании это сводится к вопросу о стиле.

5
ответ дан 24 November 2019 в 00:11
поделиться

Не удалось найти точную ссылку, но я вижу, что пример кода для os.walk использует os.path, но импортирует только os

4
ответ дан 24 November 2019 в 00:11
поделиться

Согласно PEP-20 Тима Петерса, «Явное лучше, чем неявное» и «Читаемость имеет значение». Если все, что вам нужно от модуля os , находится в разделе os.path , import os.path будет более явным и позволит другим узнать, что вас действительно волнует.

Аналогичным образом, PEP-20 также говорит: «Простое лучше, чем сложное», поэтому, если вам также нужны материалы, которые находятся под общим зонтиком os , import os будет предпочтительнее.

29
ответ дан 24 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: