Вы можете сделать модули вызываемыми, если вы действительно этого хотите.
Кристоф Боддекер обрисовал в общих чертах решение , которое добавляет магический метод __call__
к подклассуtypes.ModuleType
и назначает этот класс модулю.Этот ответ основан на подходе Алекса Мартелли о замене фактического модуля в sys.modules экземпляром вызываемого класса, который вызывает рассматриваемый метод.Последнее решение скрывает все содержимое модуля, которое не было добавлено в класс, в то время как первое решение поддерживает поведение модуля и доступ к элементам, содержащимся в нем.
В переводе на ваше требование решение Кристофа будет выглядеть так:это:
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()
явно