Как вызвать исключение, если имя атрибута абстрактного класса опечатано - PullRequest
0 голосов
/ 10 мая 2019

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

class FooAbstract:
    default_value = 'spam'  # This could be overriden

class MyFoo(FooAbstract):
    defualt_value = 'bar'  # A user mistyped the name and he should be notified

Я думаю, difflib.SequenceMatcher можно использовать для проверкинедавно добавленные имена переменных:

from difflib import SequenceMatcher

orig_names = set([a for a in dir(FooAbstract) if not a.startswith('__')])
new_names = set(dir(MyFoo)) - set(dir(FooAbstract))

for orig_name in orig_names:
    for new_name in new_names:
        if 0.9 < SequenceMatcher(a=orig_name, b=new_name).ratio() < 1:
            message = f'You probably misstyped "{new_name}" (use "{orig_name}" instead)'
            raise AttributeError(message)

Мой вопрос: куда мне поместить это условие, чтобы выполнить его во время загрузки подкласса MyFoo?

1 Ответ

1 голос
/ 10 мая 2019

Класс FooAbstract должен определять __init_subclass__.Этот init subclas hook - лучшее место для таких тестов, как ваш.Он так же задокументирован, как инструмент для настройки создания классов.

Этот метод вызывается всякий раз, когда вмещающий класс находится в подклассе.cls - это новый подкласс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...