Skip to content

Instantly share code, notes, and snippets.

@strizhechenko
Created July 22, 2017 11:20
Show Gist options
  • Save strizhechenko/3f21f96d3bcea8d3a4ebc6b353e2a5d8 to your computer and use it in GitHub Desktop.
Save strizhechenko/3f21f96d3bcea8d3a4ebc6b353e2a5d8 to your computer and use it in GitHub Desktop.
Entry points usage in netutils-linux-monitoring

Из 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())

Но тоже бессмысленный сам по себе метод получается, особой логической нагрузки не несёт.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment