检查类是否是Python中的dataclass

2024-09-28 21:35:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,如何检查类是否是dataclass?在

我发现我可以检查__dataclass_fields____dataclass_params__属性的存在性,但我希望找到一种更优雅的方法来完成这项工作。在

我希望使用inspect.isclass函数。例如,inspect.isdataclass。在

Python有这样的东西吗?在

谢谢。在


Tags: 方法函数fields属性paramsdataclassinspectisclass
2条回答

Docs

import dataclasses
dataclasses.is_dataclass(something)

正如@Arne在内部提到的,它只是检查hasattr(something, '__dataclass_fields__'),但我建议不要依赖它:

  • 它不是一个公共API:文档中没有提到它。在
  • 这是一个实现细节,因此不能保证在其他python实现中也能工作。但是除了cPython似乎还没有什么东西支持Python3.7。至少Jython、IronPython和pypyy不支持它。在

其他所有内容,包括检查dataclass类型和dataclass实例之间的区别,都在is_dataclass方法的文档中

在上述答案的基础上,以下说明了is_dataclass()的用法:

记住:传递给is_dataclass()的参数可以是dataclass或dataclass的实例,以便从方法调用中返回True。在

In [1]: from dataclasses import dataclass

In [2]: @dataclass
   ...: class Bio:
   ...:     name: str
   ...:     age: int
   ...:     height: float
   ...:

In [3]: from dataclasses import is_dataclass

In [4]: is_dataclass(Bio)
Out[4]: True

In [5]: b = Bio('John', 25, 6.5)

In [6]: is_dataclass(b)
Out[6]: True

要检查,b是否是dataclass的实例而不是dataclass本身:

^{pr2}$

Bio是一个数据类,因此以下表达式的计算结果为False

In [8]: is_dataclass(Bio) and not isinstance(Bio, type)
Out[8]: False

让我们检查常规类:

In [9]: class Car:
   ...:     def __init__(self, name, color):
   ...:         self.name = name
   ...:         self.color = color
   ...:

我们知道Car不是数据类:

In [10]: is_dataclass(Car)
Out[10]: False

In [11]: c = Car('Mustang', 'Blue')

Car的实例都不是dataclass实例:

In [12]: is_dataclass(c)
Out[12]: False

相关问题 更多 >