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
。
我正在对新的 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
。