2015-02-05 1 views
2

Если я в настоящее время есть файл, который импортирует:Python подмодуль в том же файле, как модуль

from foo import f0 
from foo.bar import f1 

Я могу создать файл foo.py с функцией f0 в нем, чтобы удовлетворить первый импорт.

Есть ли способ удовлетворить второй импорт из этого же файла foo.py?

ответ

0

Создайте директорию с именем Foo

  • В этом каталоге есть файл с именем __init__.py
  • Это эффективно создает модуль под названием Foo
  • В этом файле хранятся функции, которые вы хотите в комплекте с обув

Создайте подкаталог foo, называемый bar.

  • В этом каталоге есть файл с именем __init__.py
  • Это эффективно создает подмодуль foo.bar
  • В этом файле, сохранить функции, которые вы хотите в комплекте с foo.bar
+2

Это не отвечает на вопрос; мой вопрос заключается в том, чтобы решить только файл с именем 'foo.py'. Менее ограниченная версия проблемы требует использования 'foo.py, но позволяет импортировать этот файл из других файлов. –

+1

Возможно, стоит отметить, почему я хотел это сделать: я использую данную библиотеку (фактически скомпилированный код на C++) который разговаривает с оборудованием, к которому у меня не всегда есть доступ. Поэтому я хотел сделать несколько заметок для работы над кодом. Однако я хотел, чтобы это был один файл, поэтому я не слишком сильно загрязняю свою рабочую директорию. Я не знаю, если это что-то вроде того, что @Alex имел в виду ... – NichtJens

-1

Нет, вы должны создать каталог с именем foo в качестве пакета.

Нажмите here читать официальную документацию о The import system

1

Я просто хотел, чтобы сделать ту же самую вещь. Я нашел этот вопрос без фактического ответа. Итак, вот что я придумал как решение:

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.