【发布时间】:2019-07-07 03:46:48
【问题描述】:
我有一个接受任何dataclass 实例的函数。
什么是合适的类型提示?
在 python 文档中没有找到官方的东西
这是我一直在做的,但我认为它不正确
from typing import Any, NewType
DataClass = NewType('DataClass', Any)
def foo(obj: DataClass):
...
另一个想法是使用Protocol 和这些类属性__dataclass_fields__、__dataclass_params__。
【问题讨论】:
-
呃,什么?带有
@dataclass装饰器的类和没有装饰器的类之间没有明显的区别。数据类不实现任何特殊方法,也没有任何特殊属性。区分“数据类”和“常规”类没有任何意义。 -
该函数将数据类解包到字典中,它们具有特殊属性
__dataclass_fields__、__dataclass_params__。如问题所述。关于命名元组也可以这样说,并且确实有类型提示,即使它们只是从tuple继承 -
这些属性没有记录,因此我建议不要依赖它们的存在。不过,我认为没有明显的差异是错误的;像
dataclasses.astuple这样的函数只适用于数据类。 -
所以
Protocol和astuple方法?听起来不错,但有点不稳定。不知道为什么他们决定用装饰器创建dataclasses,而不是通过继承和像namedtuples 这样的元类。 -
没错,我看了源码,python实际上实现了一个函数
_is_dataclass_instance。它检查它是否具有属性__dataclass_fields__,我认为这已经足够了。
标签: python protocols python-3.7 python-dataclasses