Для пакета пространства имен __spec __. Loader и __loader__ атрибуты не установлены в None - PullRequest
0 голосов
/ 18 октября 2018

Справочник по языку Python гласит:

Чтобы указать оборудованию импорта, что спецификация представляет часть пространства имен.средство поиска записи пути устанавливает для «loader» в спецификации значение None, а для «submodule_search_locations» - список, содержащий эту часть.

Справочник по библиотеке Python состояния:

Загрузчик для загрузки.Для пакетов пространства имен это должно быть установлено на None.

При этом создается пакет пространства имен, части которого расположены в двух разных путях a/ и b/ в файловой системе:

a/
  namespace_package/
    module_1.py
    module_2.py
b/
  namespace_package/
    module_3.py

, затем добавьте эти пути в переменную среды PYTHONPATH:

export PYTHONPATH="a:b"

и, наконец, импортируйте пакет пространства имен и напечатайте его атрибуты __spec__.loader и __loader__ с интерпретатором CPython 3.7:

python3 -c "import namespace_package; print(namespace_package.__spec__.loader); print(namespace_package.__loader__)"

показывает, что они являются , а не None:

<_ frozen_importlib_external._NamespaceLoader объект в 0x104b04128> <_frozen_importlib_external._NamespaceLoader 004 объекта 004 на 004* </blockquote>

Это ошибка документации, ошибка реализации или мое неправильное толкование?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

В этом случае mod.__spec__.loader - это не то же самое, что mod.__loader__.Загрузчик спецификации все равно должен быть None.Загрузчик модуля устанавливается механизмом импорта на экземпляр внутреннего _NamespaceLoader, частично для перезагрузки.Возможно, документы недостаточно ясны по этому поводу.

0 голосов
/ 07 ноября 2018

Похоже, это было правильно , но было изменено .

Открыта проблема для отслеживания: https://bugs.python.org/issue35181

0 голосов
/ 19 октября 2018

Я бы предположил, что когда-то это было None, но больше нет, из-за изменений в Python.Это вызывает у вас проблемы?Если это так, то я бы поднял вопрос, но решение вполне может быть, чтобы обновить документацию.Можете ли вы проверить, какие результаты вы получите с Python 3.6 и / или 3.5?Также стоит проверить примечания к выпуску Python, чтобы увидеть, какие обновления были в этой области.

...