Обеспечение отсутствия функции __init__ в Python - PullRequest
1 голос
/ 22 апреля 2019

Я пишу приложение на основе плагинов.Часть спецификации для плагина заключается в том, что плагин не должен реализовывать метод __init__, так как любая инициализация должна обрабатываться менеджером плагинов, а не самим плагином.(Автор плагина определит свой код запуска в другом методе, вызываемом менеджером плагинов после выполнения некоторых проверок.)

Для применения этого стиля диспетчер плагинов должен завершиться с ошибкой, вызвать исключение или выполнить какой-либо другойобескураживающее действие, если используется __init__.

Я подумал, что могу просто проверить, определено ли __init__:

# minimaltest.py
__meta__ = "Minmimal metadata"
# main.py
import minimaltest
hasattr(minimaltest, '__meta__')  # => True
hasattr(minimaltest, '__somethingimadeup__')  # => False
hasattr(minimaltest, '__init__')  # => True?!

Проблема: вызов hasattrвсегда возвращает True

Как я могу убедиться, что любой предполагаемый скрипт плагина не реализовал метод __init__?

1 Ответ

3 голосов
/ 22 апреля 2019

hasattr возвращает True для присутствия __init__, потому что созданный нами минимальный class наследуется от Object, который поставляется с этим определенным методом.

Если мы хотим увидетькакие методы есть у нашего минимального class, без получения методов, которые superclass определил , вы можете вызвать __dict__ и получить list, который легко проверить с помощью .keys:

if '__init__' in minimal.__dict__.keys():
    raise RuntimeError("Plugins may not define __init__ methods")
...