Почему относительный импорт так ограничен? - PullRequest
0 голосов
/ 03 мая 2018

С каталогом:

app/
    sub1/
        __init__.py
        module1.py
    sub2/
        __init__.py
        test.py

Что я представляю для импорта модуля:

  1. создать область (или поток?)

  2. запустить module.py в этой области

from ..sub import module1 недопустимо с верхним уровнем на test.py

но open('../sub1/module1.py', 'r') работает !!

Так что это читабельно, но не импортируется.

Начните с чего-то похожего на import moudule as *

exec(open('../sub1/module1.py', 'r').read())

Далее выполните этот сценарий в отдельной области и назовите эту область.

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

import module1 as cus

class Module:
    exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = Mudule()
cus.function_inside_module1()

функция exec(object[, globals[, locals]]) запустить object в области действия globals и сохранить переменные в locals. (Наверное)

Поскольку аргументы globals и locals являются locals() класса Module, это похоже на то, что я представляю для импорта.

Если это работает должным образом, я думаю, модуль под модулем может быть записан как вложенный класс.

Какие проблемы вызовет этот странный импорт?

Если нет, то почему файл читаемый, но не импортируемый (с ограничением верхнего уровня)?

Редактировать

@ user2357112 извините, я не знал, как написать многострочный комментарий:

даст ли это поведение, которое вы запрашивали при загрузке родительского пакета?

class sub1:
    exec(open('../sub1/__init__.py', 'r').read(), locals(), locals())
    class Module:
        exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = sub1.Module()
del sub1

1 Ответ

0 голосов
/ 03 мая 2018

Относительный импорт не является механизмом обхода каталога. from ..a import b не означает «перейти в каталог, войти в каталог a и загрузить b.py». Это означает «импортировать b член подмодуля a родительского пакета текущего пакета ». Обычно это очень похоже на то, что будет делать обход каталога, но это не одно и то же, особенно для случаев, связанных с пакетами пространства имен, пользовательскими загрузчиками модулей или sys.modules манипуляциями.

sub2 не имеет родительского пакета. Попытка сослаться на несуществующий родительский пакет является ошибкой. Кроме того, если вы запускаете test.py напрямую по имени файла, sub2 даже не считается пакетом.

...