如何检查Python中的类是否为dataclass
?
我发现我可以检查__dataclass_fields__
和__dataclass_params__
属性的存在,但是我很想找到一种更优雅的方法。
我希望使用类似inspect.isclass
的函数。例如,也许像inspect.isdataclass
之类的东西。
Python有这样的东西吗?
谢谢。
答案 0 :(得分:5)
import dataclasses
dataclasses.is_dataclass(something)
正如@Arne内部提到的那样,它仅检查hasattr(something, '__dataclass_fields__')
,但我建议不要依赖它:
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