Python 数据类:FrozenInstanceError 是 AttributeError 的子类?

Python Dataclasses: FrozenInstanceError a subclass of AttributeError?

我正在对新的 python 数据类进行一些自学。

可以传递给数据类装饰器的参数之一是 frozen=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),测试会按预期失败。

这是一个子class,您可以使用built-in函数轻松验证issubclass:

>>> issubclass(FrozenInstanceError, AttributeError)
True

如果您想要在测试中进行 精确 类型匹配,我认为这是最佳实践,那么您可以使用异常实例而不是异常 class。作为一个额外的好处,这还允许您对异常上下文进行断言(即哪个字段触发了异常)。

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

pytest.raises 的这种用法需要安装我的插件 pytest-raisin