【问题标题】:Python submodule in the same file as module与模块在同一文件中的 Python 子模块
【发布时间】: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


    【解决方案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 导入为 sm2

    在 [3] 中:sm1。 [标签]

    sm1.foo sm1.mro

    在 [3] 中:sm2。 [标签]

    sm2.bar sm2.mro


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

    【讨论】:

      【解决方案2】:

      创建一个名为 foo 的目录

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

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

      • 在此目录中,有一个名为__init__.py 的文件
      • 这有效地创建了一个子模块 foo.bar
      • 在此文件中,存储您希望与 foo.bar 捆绑的函数

      【讨论】:

      • 这不能回答问题;我的问题是仅使用名为foo.py 的文件的解决方案。该问题的限制较少的版本需要使用 `foo.py,但允许从其他文件导入该文件
      • 也许值得指出,我为什么要这样做:我正在使用一个给定的库(实际编译的 C++ 代码),它与我并不总是可以访问的硬件进行通信。因此,我想模拟一些用于处理代码的替代品。但是,我希望这是一个单独的文件,所以我不会过多地污染我的工作目录。我不知道这是否像@Alex 所想的那样......
      【解决方案3】:

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

      点击here阅读The import system官方文档

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        • 2012-04-20
        • 2012-05-05
        相关资源
        最近更新 更多