如果我现在有一个正在导入的文件:
from foo import f0
from foo.bar import f1
我可以在文件foo.py
中创建一个函数f0
来满足第一个import的需求。
有没有办法在同一个文件foo.py
中满足第二个import的需求?
如果我现在有一个正在导入的文件:
from foo import f0
from foo.bar import f1
我可以在文件foo.py
中创建一个函数f0
来满足第一个import的需求。
有没有办法在同一个文件foo.py
中满足第二个import的需求?
我也想做同样的事情,但找到的问题都没有实际答案。所以,这是我想出来的解决方案:
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__)
我担心没有更好的方法把父级的名称传递给函数中。
现在可以这样使用这两种情况:
In [1]: import submodtest.submod1 as sm1
In [2]: import submodtest.submod2 as sm2
In [3]: sm1. [TAB]
sm1.foo sm1.mro
In [3]: sm2. [TAB]
sm2.bar sm2.mro
编辑:将以上完整示例推送到我的Github。
__init__.py
的文件在foo下创建一个名为bar的子目录
__init__.py
的文件
foo.py
的文件的解决方案。更宽松版本的问题允许使用foo.py
文件导入其他文件。 - Alex Rothberg