выполнение модулей цепочки Python - PullRequest
0 голосов
/ 26 июня 2018

У меня такая ситуация:

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 голосов
/ 26 июня 2018

Вы можете сделать модули вызываемыми, если вы действительно этого хотите.

Кристоф Боддекер обрисовал в общих чертах решение , которое добавляет магический метод __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()

Однако,Я бы посоветовал не делать этого.

  1. Я считаю это нарушением принципа наименьшего удивления.
  2. Реализация любого из подходов на каждом модуле, который вы хотите вызвать, является, вероятно, большей работой, чемпросто позвонив moduleA.main() явно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...