Классы данных Python: FrozenInstanceError подкласс AttributeError? - PullRequest
1 голос
/ 29 мая 2019

Я занимаюсь самообучением по новым классам данных Python.

Один из параметров, который можно передать декоратору класса данных, замораживается = True, чтобы сделать объект неизменным.

В документации (и опыте) указывается, что:

dataclasses.FrozenInstanceError

Возникнет исключение.

При модульном тестировании, хотя (с pytest), проходит следующий тест:

def test_change_page_url_values_raises_error(self, PAGE_URL):
    page_url = PageURL(PAGE_URL)
    with pytest.raises(AttributeError) as error:
        page_url.value = PAGE_URL

где PageURL - класс данных с параметром frozen = True.

Есть идеи, почему pytest указывает, что это действие (присвоение значения page_url.value) вызывает ошибку атрибута? FrozenInstanceError наследует от AttributeError?

Примечание. Если я изменю модульный тест для проверки другого исключения (например, TypeError), тест завершится неудачно, как и ожидалось.

1 Ответ

3 голосов
/ 30 мая 2019

Это подкласс, который вы можете легко проверить с помощью встроенной функции issubclass:

>>> issubclass(FrozenInstanceError, AttributeError)
True

Если вы хотите точное совпадение типа в тестах, которые я бы рекомендовал, вы можете использовать экземпляр исключения вместо класса исключения.В качестве дополнительного бонуса это также позволяет вам сделать утверждение в контексте исключения (то есть, какое поле вызвало исключение).

with pytest.raises(FrozenInstanceError("cannot assign to field 'value'")):
    page_url.value = PAGE_URL

При использовании pytest.raises требуется установка моего плагина pytest-raisin.

...