我确实有以下情况:
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()
这是可以实现的吗?我知道上面的代码将无法正常工作,因为模块无法调用。
答案 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()
但是,我建议不要这样做。
moduleA.main()
可能要耗费更多精力