Python数据类:FrozenInstanceError AttributeError的子类?

Python数据类:FrozenInstanceError AttributeError的子类?,python,pytest,python-dataclasses,Python,Pytest,Python Dataclasses,我正在对新的python数据类进行一些自学 可以传递给dataclass装饰器的参数之一是freeze=True,以使对象不可变 文件(和经验)表明: dataclasses.FrozenInstanceError 将提出例外情况 当通过单元测试(使用pytest)时,以下测试通过: def test_change_page_url_values_raises_error(self, PAGE_URL): page_url = PageURL(PAGE_URL) with py

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

可以传递给dataclass装饰器的参数之一是freeze=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是一个带有freezed=True参数的数据类

你知道为什么pytest指出这个操作(给page_url.value赋值)会引发属性错误吗?FrozenInstanceError是否从AttributeError继承


注意:如果我将单元测试更改为测试不同的异常(即TypeError),测试将按预期失败。

这是一个子类,您可以使用内置函数轻松验证:

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


使用
pytest.raises
需要安装我的插件。

签入shell
issubclass(dataclasses.frozeInstanceError,AttributeError)
是:)啊。非常感谢。为了研究这一点,我一直在尝试:在单元测试本身中断言issubclass(type(error)、AttributeError)。我刚刚意识到pytest返回的是一个ExceptionInfo类作为错误,而不是最初引发的异常。。。下次将facepalm保存到shell。@Steven为了将来参考,最初引发的异常将存储为该
ExceptionInfo
上下文管理器的
value
属性,即
error.value
>>> issubclass(FrozenInstanceError, AttributeError)
True
with pytest.raises(FrozenInstanceError("cannot assign to field 'value'")):
    page_url.value = PAGE_URL