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()
但是,我建议不要这样做。
- 我认为这违反了最小惊讶原则。
- 可以说,在您希望调用的每个模块上实施任何一种方法都比简单地显式调用
moduleA.main()
工作量更大
我确实有如下情况:
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()
但是,我建议不要这样做。
- 我认为这违反了最小惊讶原则。
- 可以说,在您希望调用的每个模块上实施任何一种方法都比简单地显式调用
moduleA.main()
工作量更大