【发布时间】:2015-04-04 21:57:59
【问题描述】:
如果我目前有一个正在导入的文件:
from foo import f0
from foo.bar import f1
我可以创建一个文件foo.py,其中包含一个函数f0,以满足第一次导入。
有什么方法可以满足从同一文件foo.py 中的第二次导入?
【问题讨论】:
标签: python python-import python-module
如果我目前有一个正在导入的文件:
from foo import f0
from foo.bar import f1
我可以创建一个文件foo.py,其中包含一个函数f0,以满足第一次导入。
有什么方法可以满足从同一文件foo.py 中的第二次导入?
【问题讨论】:
标签: python python-import python-module
我只是想做同样的事情。我只发现了这个问题,没有实际答案。所以,这就是我想出的解决方案:
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 导入为 sm2
在 [3] 中:sm1。 [标签]
sm1.foo sm1.mro
在 [3] 中:sm2。 [标签]
sm2.bar sm2.mro
编辑:将上面的完整示例推送到my Github。
【讨论】:
创建一个名为 foo 的目录
__init__.py 的文件
创建 foo 的子目录,称为 bar。
__init__.py 的文件
【讨论】:
foo.py 的文件的解决方案。该问题的限制较少的版本需要使用 `foo.py,但允许从其他文件导入该文件
不,你应该创建一个名为 foo 的目录作为一个包。
点击here阅读The import system官方文档
【讨论】: