Я просто хотел, чтобы сделать ту же самую вещь. Я нашел этот вопрос без фактического ответа. Итак, вот что я придумал как решение:
import sys
def add_submodule(submod):
name = submod.__name__
sys.modules[__name__ + "." + name] = submod(name)
from types import ModuleType
class submod1(ModuleType):
class foo:
pass
class submod2(ModuleType):
class bar:
pass
add_submodule(submod1)
add_submodule(submod2)
В сущности, вы подкласс types.ModuleType
для определения модуля. Затем вы добавляете его вручную в sys.modules
под пространством имен текущего модуля, как указано __name__
.
Это минимальное решение. Если вы захотите переместить add_submodule()
в отдельный автономный модуль для повторного использования, его нужно будет немного развернуть: Нельзя было просто использовать __name__
, поскольку это было бы пространство имен, в котором было определено значение add_submodule()
. Это должно работать вместо:
В отдельном модуле:
def add_submodule(submod, parentname):
name = submod.__name__
sys.modules[parentname + "." + name] = submod(name)
В реальном модуле:
add_submodule(submod1, __name__)
add_submodule(submod2, __name__)
Я боюсь, что нет лучше способа получения имени родителя в го е функция.
Оба случая теперь могут быть использованы следующим образом:
В [1]: импорт submodtest.submod1 как SM1
В работе [2]: импорт submodtest.submod2 в
см2
В [3]: см1. [TAB]
sm1.foo sm1.mro
В работе [3]: см2. [TAB]
sm2.bar sm2.mro
РЕДАКТИРОВАТЬ: протолкнул выше полный пример my Github.
Это не отвечает на вопрос; мой вопрос заключается в том, чтобы решить только файл с именем 'foo.py'. Менее ограниченная версия проблемы требует использования 'foo.py, но позволяет импортировать этот файл из других файлов. –
Возможно, стоит отметить, почему я хотел это сделать: я использую данную библиотеку (фактически скомпилированный код на C++) который разговаривает с оборудованием, к которому у меня не всегда есть доступ. Поэтому я хотел сделать несколько заметок для работы над кодом. Однако я хотел, чтобы это был один файл, поэтому я не слишком сильно загрязняю свою рабочую директорию. Я не знаю, если это что-то вроде того, что @Alex имел в виду ... – NichtJens