创建Python外观包

时间:2014-04-02 19:40:37

标签: python packages

我不确定如何描述这个,但是有没有办法创建一个处理内部包的多个版本的façade包?

考虑:

Foo/
    __init__.py
    A/
       Bar/
       __init__.py
       etc.
    B/
       Bar/
       __init__.py
       etc.
    C/
       Bar/    
       __init__.py
       etc.

Inside Package的__init__.py我有python逻辑来附加sys.path以指向其中一个Bar包,具体取决于运行时配置。这让我使用了两个python import语句。

import Foo
import Bar

我可以将其减少为一个导入语句,并将Foo视为正确版本的Bar的外观。我发现的唯一基于此post。在foo.py的__init__.py

for attr in dir(bar):
    globals()[attr] = getattr(bar, attr) 

1 个答案:

答案 0 :(得分:0)

我建议不要修改system.path,因为这会对不相关的代码产生影响。

您可以使用sys.modules来解决此问题。导入模块时,它将在sys.modules字典中注册。您只需在导入时为代理模块设置条目即可完成此操作。

implementation.py:

def method():
    print "implemented method"

proxy.py:

if __name__ != '__main__':
    import sys
    import implementation
    sys.modules[__name__] = implementation

main.py:

if __name__ == '__main__':
    import proxy
    proxy.method()

输出:

$ python main.py 
implemented method