Я недавно обновил версии pylint , популярного средства проверки стиля Python.
Во всем моем коде он стал баллистическим, указывая на места, куда я импортирую модули в одном пакете, без указания полного пути к пакету.
Новое сообщение об ошибке W0403.
W0403: Относительный импорт% r, должен быть% r
Используется при обнаружении импорта относительно каталога пакета.
пример
Например, если мои пакеты структурированы так:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
и в упаковке губки я пишу:
import icing
вместо
import cake.icing
Я получу эту ошибку.
Хотя я понимаю, что не все сообщения Pylint имеют одинаковую важность, и я не боюсь отклонить их, я не понимаю, почему такая практика считается плохой идеей.
Я надеялся, что кто-нибудь сможет объяснить подводные камни, поэтому я мог бы улучшить свой стиль кодирования, а не (как я планирую сделать в настоящее время) отключить это явно ложное предупреждение.
источник
import .icing
вместоfrom . import icing
from <> import
;import <>
всегда абсолют. Конечно, абсолютный импорт можно использоватьfrom <> import
, опуская ведущие точки. Причинаimport .foo
запрещена, потому что послеimport XXX.YYY.ZZZ
этогоXXX.YYY.ZZZ
можно использовать в выражении. Но.moduleY
не может быть использовано в выражении.Есть несколько веских причин:
Относительный импорт легко ломается, когда вы перемещаете модуль.
Представьте, что у вас есть
foo.bar
, afoo.baz
иbaz
модуль в вашей упаковке.foo.bar
импортfoo.baz
, но с использованием относительного импорта.Теперь, если вам нужно перейти
foo.bar
кbar
, ваш модуль неожиданно импортирует другойbaz
!Относительный импорт неоднозначен. Даже не перемещаясь по
bar
модулю в вышеприведенном примере, новый разработчик, пришедший в ваш проект, может быть прощен за то, что не осознает, чтоbaz
это на самом делеfoo.baz
вместо пакета корневого уровняbaz
.Абсолютный импорт делает явным то, какой модуль используется. И, как
import this
проповедует, явное лучше, чем неявное.Python 3 полностью отключил неявный относительный импорт;
import baz
import теперь всегда интерпретируется как абсолютный, что означает, что в приведенном выше примере всегда будет импортироваться модуль верхнего уровня. Вместо этого вам придется использовать явный синтаксис импорта (from . import baz
).Таким образом, перенос примера с Python 2 на 3 приведет к неожиданным проблемам, а использование абсолютного импорта сделает ваш код перспективным.
источник