将模块聚合为单个“外观”模块的惯用方法

时间:2011-08-12 17:09:02

标签: python

  1. 我想将来自不同包的已知模块列表(barbazqux)合并到一个模块中,我的应用程序可以将其作为外观访问( foo)。

  2. 我还希望barbazqux能够控制“导出”的内容,而foo则不知道内容这些模块只会“重新导出”它们。

  3. 例如:

    foo.py

    的全部内容
    from somepackage.bar import *
    from otherpackage.baz import *
    from yetanotherpackage.qux import *
    

    bar,baz和qux的部分内容:

    bar.py:

    def bar1():
       print "bar1"
    
    __all__ = ["bar1"]
    

    baz.py:

    def baz1():
       print "baz1"
    
    def baz2():
       print "baz1" 
    
    __all__ = ["baz1", "baz2"]
    

    qux.py:

    def qux1():
       print "qux1" 
    
    __all__ = ["qux1"]
    

    现在,当我在我的应用程序中导入foo时,我将可以访问foo.bar1foo.baz1foo.baz2foo.qux1。这就是我想要的。

    但是,使用import *会产生一种耻辱感,这让我觉得我有可能忽略这样做的一些陷阱。

    我的榜样是否超越了实现上述两个目标的惯用方法?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

在我看来,这几乎是import *唯一合理的用例。我觉得你做的方式很好。如果您没有在其他模块中定义__all__,那么我仍然建议您明确地从每个模块中导入所需的名称。