python链接模块执行

时间:2018-06-26 08:12:18

标签: python module chaining

我确实有以下情况:

main.py
moduleA.py
moduleB.py

moduleA contains main() function
moduleB contains main() function

我主要从事:

import moduleA, moduleB

def main():
    moduleA.main()
    moduleB.main()

if __name__ == '__main__':
    main()

我想知道我是否可以链接模块执行:

import moduleA, moduleB

def main():
    moduleA().moduleB()

if __name__ == '__main__':
    main()

这是可以实现的吗?我知道上面的代码将无法正常工作,因为模块无法调用。

1 个答案:

答案 0 :(得分:1)

如果您确实愿意,您可以使模块可调用。

Christoph Böddeker has outlined a solution,将__call__魔术方法添加到types.ModuleType的子类中,并将该类分配给模块。该答案基于Alex Martelli's approach,该方法是用可调用的类实例替换sys.modules中的实际模块,该实例调用有问题的方法。后一种解决方案隐藏了尚未添加到类中的模块的所有内容,而前一种解决方案则维护了模块的行为以及其中包含的项目的公开性。

根据您的要求,Christoph的解决方案如下所示:

moduleA.py和moduleB.py

import sys

class MyModule(sys.modules[__name__].__class__):
    def __call__(self):
        self.main() # call your main function here

sys.modules[__name__].__class__ = MyModule


def main():
    "do your stuff"

main.py

import moduleA, moduleB

def main():
    moduleA()
    moduleB()

if __name__ == '__main__':
    main()

但是,我建议不要这样做。

  1. 我认为这违反了最小惊讶原则。
  2. 在每个您希望可调用的模块上实现这两种方法比简单地显式调用moduleA.main()可能要耗费更多精力