【问题标题】:How to import multiple objects in different files easily如何轻松导入不同文件中的多个对象
【发布时间】:2022-01-09 16:58:06
【问题描述】:
application
├── folder
│       └── A.py --> class A:...
│       └── B.py --> class B:...  
│       └── C.py --> class C:...
└── __init.py__

将 A、B 和 C 类放入 __init__.py 的最佳方法是什么? 以下是一种方法

from .folder.A import A
from .folder.B import B
from .folder.C import C

但是我可以使用一种更简单的衬里吗?类似from .folder.* import A,B,C

【问题讨论】:

    标签: python python-3.x import python-import importerror


    【解决方案1】:

    你写的就可以了,除非你想写一个循环,否则没有多模块导入单行:

    import importlib
    for sub in "A B C".split():
        globals()[sub] = getattr(importlib.import_module(".folder." + sub), sub)
    

    我写上面的只是为了表明这是多么难看。

    稍微好一点的方法是在folder.__init__做它

    # folder.__init__
    from A import *
    from B import *
    from C import *
    
    # __init__
    from .folder import *
    

    要保留对此的一些控制并防止意外,请在各个模块中定义 __all__ 以限制被拉到顶部的内容:

    # folder.A
    __all__ = ["A"]
    
    # folder.B
    __all__ = ["B"]
    
    # etc.
    

    现在,我在这里真正建议的是:在找到原因之前,不要将事情分解成模块。如果 A/B/C 之间存在如此紧密的依赖关系,以至于它们最终总是一起导入——你的问题就是这种情况——将它们全部放入 folder.py module (甚至单独的目录),只需在__init__ 中执行from .folder import A, B, C。存在模块的原因是为了放松代码块之间的依赖关系,并允许使用一些代码而无需导入更多代码。如果某些代码必须始终在一起,请将其放在同一个模块中。

    【讨论】:

    • 非常感谢您的回复。有趣的是,您提到不要将其分解为模块。正如您所提到的,我最初将所有内容都放在一个模块中,但认为将每个类放在单独的文件中可能会更干净,因为每个类可能会变长并且拥有一个超长文件可能会不美观。有兴趣了解您的想法。
    • 这是个人喜好问题,但对于 Python,没有义务维护每个模块的类结构。您还需要注意,执行from application.folder.A import A 实际上会导入一切,因为它首先导入application,这将级联您询问的导入。
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2021-08-28
    • 2010-10-07
    相关资源
    最近更新 更多