Python 3.3 продолжает радовать. Сегодня в него вошли изменения от Bratt Cannon. Теперь import
реализован почти весь на питоне, в библиотеке importlib
. Она и раньше присутствовала — но теперь __import__
ведёт напрямую в importlib
.
Казалось бы, какая разница? На самом деле всё просто:
-
Проще поддерживать и развивать. Существующий код в
import.c
нелегко читать и ещё сложнее понимать во всех деталях (включая в том числе и кроссплатформенность). Теперь ситуация значительно улучшится. -
Легче изучать. Повторюсь, понимать реализацию по чтению
Python/import.c
(а именно там расположен почти весь код, относящийся к импорту модулей и пакетов) — нелегко. Отчасти потому, что написана наC
, в то время как большинства питонщиков этот язык, к сожалению, практически не знаком. Главная же причина в том, что этот механизм эволюционировал потихоньку, счастливо избегая больших переделок — но уверенно вбирая в себя сотни мелких и средних улучшений. Проще и понятней от этого не становилось. -
Унификация. Сложилась на самом деле парадоксальная ситуация: в то время как PEP 302, исчерпывающе описывает то, как должен работать механизм импорта — Питон этим не пользуется. То есть да, PEP 302 полностью реализован и поддерживается — но стандартный импорт из файловой системы идёт в обход этих правил. Не подумайте плохого — ничего не ломается. Но одновременное существование двух дублирующих систем — одной для импорта из файловой системы, а второй для поддержки PEP 302, — уже не очень хорошая вещь.
-
Снова вспоминаем про поддержку, развитие и изучение. Почему, например, по умолчанию
sys.meta_path
пустой? Отчего вsys.path_hooks
есть толькоzipimporter
? Где вообще import hooks для загрузки модулей из файловой системы? Почему Python не прописывает в модулях__loader__
, хотя PEP 302 однозначно предписывает это делать? -
Как, в конце концов, всё работает? Читатель, вы уверены что понимаете механизм во всех деталях?
Документация хороша, но она описывает далеко не все нюансы. Когда я попытался разобраться — мне пришлось потратить немало времени. Потом это вылилось в серию статей, посвящённых импорту: часть 1, часть 2, часть 3, импорт и юникод. На этом терпение закончилось и заключительные статьи серии так и не были опубликованы.
Изучение было крайне увлекательным, но меня не оставляло чувство, что процесс должен быть намного проще, ведь Питон старается избегать чрезмерно усложнённых решений.
Так и произошло. Сейчас импорт уже стал проще и понятней, это просто замечательно. В дальнейших планах — подчистка и сокращение кода на С, сведение его объёма к минимуму.
Немного о скорости. Питоновская реализация примерно на 5% медленней — что никого не беспокоит. Быть может, к версии 3.4 маятник качнётся назад, и наиболее критические части кода будут реализованы на С (как это произошло, например, с модулем io
). Сейчас гораздо важнее корректность, — а скорость, и без того вполне приемлемая, вполне может подождать своего часа.
Запасайтесь поп-корном, Python 3.3 будет выпущен в конце августа. Это будет по настоящему выдающаяся версия!
Вышел релиз и начались ImportError'ы :(
ОтветитьУдалитьЗаполните issue на bugs.python.org
УдалитьПоставьте меня (asvetlov) в nosy list.