Python子模块与模块在同一文件中

时间:2015-02-05 06:10:45

标签: python python-import python-module

如果我目前有一个正在导入的文件:

from foo import f0
from foo.bar import f1

我可以在其中创建一个文件foo.py,其中包含一个函数f0,以满足第一次导入。

有没有办法在同一个文件foo.py中满足第二次导入?

3 个答案:

答案 0 :(得分:3)

我只是想做同样的事情。我只找到了这个问题,没有真正的答案。所以,这就是我提出的解决方案:

ResetTimer()

实质上,您将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)

我担心没有更好的方法可以将父母的名字输入到函数中。

现在可以像这样使用这两种情况:

  

在[1]中:将submodtest.submod1导入为sm1

     

在[2]中:将submodtest.submod2导入为sm2

     

在[3]中:sm1。 [TAB]

     

sm1.foo sm1.mro

     

在[3]中:sm2。 [TAB]

     

sm2.bar sm2.mro

编辑:将上面的完整示例推送到my Github

答案 1 :(得分:-2)

创建一个名为foo的目录

  • 在此目录中,有一个名为__init__.py
  • 的文件
  • 这有效地创建了一个名为foo的模块
  • 在此文件中,存储要与foo
  • 捆绑在一起的功能

创建foo的子目录,名为bar。

  • 在此目录中,有一个名为__init__.py
  • 的文件
  • 这有效地创建了一个子模块foo.bar
  • 在此文件中,存储要与foo.bar
  • 捆绑在一起的功能

答案 2 :(得分:-3)

不,你应该创建一个名为foo的目录作为包。

点击here阅读有关The import system

的官方文档