Согласно официальной документации, os.path
модуль. Таким образом, каков предпочтительный способ импортировать его?
# Should I always import it explicitly?
import os.path
Или...
# Is importing os enough?
import os
НЕ отвечайте "на импорт os
работы для меня". Я знаю, это работает на меня слишком прямо сейчас (с Python 2.6). То, что я хочу знать, является любой официальной рекомендацией об этой проблеме. Так, при ответе на этот вопрос отправьте ссылки.
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 в начале своей карьеры путаются в модулях, пакетах и организации кода. Это происходит по двум причинам
Если вы думаете о os
как о пакете и знаете, что можете сделать import os
и получить доступ к подмодулю os.path
, вы можете удивиться позже, когда не сможете сделать import twisted
и автоматически получить доступ к twisted.spread
без его импорта.
Смущает, что os.name
- это обычная вещь, строка, а os.path
- модуль. Я всегда структурирую свои пакеты с помощью пустых файлов __init__.py
, чтобы на одном уровне у меня всегда был один тип вещей: модуль/пакет или другие вещи. Несколько крупных проектов Python используют этот подход, что, как правило, делает код более структурированным.
Интересно, что при импорте 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
модуль, который необходимо будет использовать. По сути, в моем понимании это сводится к вопросу о стиле.
Не удалось найти точную ссылку, но я вижу, что пример кода для os.walk использует os.path, но импортирует только os
Согласно PEP-20 Тима Петерса, «Явное лучше, чем неявное» и «Читаемость имеет значение». Если все, что вам нужно от модуля os
, находится в разделе os.path
, import os.path
будет более явным и позволит другим узнать, что вас действительно волнует.
Аналогичным образом, PEP-20 также говорит: «Простое лучше, чем сложное», поэтому, если вам также нужны материалы, которые находятся под общим зонтиком os
, import os
будет предпочтительнее.