检查类是否为Python中的数据类

时间:2019-05-13 05:17:38

标签: python python-3.x python-dataclasses

如何检查Python中的类是否为dataclass

我发现我可以检查__dataclass_fields____dataclass_params__属性的存在,但是我很想找到一种更优雅的方法。

我希望使用类似inspect.isclass的函数。例如,也许像inspect.isdataclass之类的东西。

Python有这样的东西吗?

谢谢。

2 个答案:

答案 0 :(得分:5)

Docs

import dataclasses
dataclasses.is_dataclass(something)

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

  • 这不是公共API:文档中没有任何提及。
  • 这是一个实现细节,因此不能保证可以在其他python实现中使用。但是,除了cPython似乎还不支持Python3.7。至少Jython,IronPython和PyPy不支持它。

is_dataclass方法的文档中所有其他内容,包括检查数据类类型和数据类实例之间的差异

答案 1 :(得分:1)

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

记住:传递给is_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是否是数据类的实例,而不是数据类本身:

In [7]: is_dataclass(b) and not isinstance(b, type)
Out[7]: True

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的一个实例都不是数据类实例:

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