python 链接模块执行

python chaining modules execution

我确实有如下情况:

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()

可以实现吗?我知道上面的代码将不起作用,因为该模块不可调用。

如果您真的愿意,您可以使模块可调用。

Christoph Böddeker has outlined a solution that adds the __call__ magic method to a subclass of types.ModuleType and assigns this class to the module. This answer is based on Alex Martelli's approach 将 sys.modules 中的实际模块替换为调用相关方法的可调用 class 实例。后一种解决方案隐藏了尚未添加到 class 的模块的所有内容,而前一种解决方案维护了模块的行为和其中包含的项目的公开。

根据您的要求,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()
  3. 工作量更大