Из entry-points насколько я понял можно вызывать только @staticmethod или функцию которая живёт сама по себе, при этом не имеющую аргументов.
Проблема: "конструктору" нужно каким-либо образом передать ссылку на самого себя, чтобы он смог вызвать свой оригинальный "чистый" конструктор.
Это одно из:
- избавление от статичности метода и передача с помощью self.
- сохранение статичности метода и явная передача self в месте вызова.
оба варианта, как я понимаю приводят к невозможности использования такого метода в качестве entry_point.
единственный оставшийся вариант - это дублирование этого самого статического метода в каждой тулзе.
Сейчас выглядит так:
class BaseTop(object):
def main(self):
""" Default entry point for most of top-like utils """
self.options = self.make_parser().parse_args()
if hasattr(self, 'post_optparse'):
self.post_optparse()
self.run()
и вызов:
if __name__ == '__main__':
IrqTop().main()
Можно сделать main @staticmethod и @abstractmethod, а в IrqTop (и остальных) его определить как:
class IrqTop(BaseTop):
def main():
top = IrqTop()
top.options = top.make_parser().parse_args()
if hasattr(top, 'post_optparse'):
top.post_optparse()
top.run()
Но это такое мерзкое дублирование, что я даже не знаю что сказать.
В принципе можно с @abstractmethod не угарать, а провернуть:
class IrqTop(BaseTop):
def main():
BaseTop.main(IrqTop())
Но тоже бессмысленный сам по себе метод получается, особой логической нагрузки не несёт.