如果我目前有一个正在导入的文件:
from foo import f0
from foo.bar import f1
我可以在其中创建一个文件foo.py
,其中包含一个函数f0
,以满足第一次导入。
有没有办法在同一个文件foo.py
中满足第二次导入?
答案 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的子目录,名为bar。
__init__.py
答案 2 :(得分:-3)
不,你应该创建一个名为foo的目录作为包。
点击here阅读有关The import system