如何在不注释类型的情况下添加数据类字段?
How to add a dataclass field without annotating the type?
当数据class中有一个字段类型可以是任何类型时,如何省略注释?
@dataclass
class Favs:
fav_number: int = 80085
fav_duck = object()
fav_word: str = 'potato'
上面的代码似乎并没有真正为 fav_duck
创建字段。它只是使它成为一个普通的旧 class 属性。
>>> Favs()
Favs(fav_number=80085, fav_word='potato')
>>> print(*Favs.__dataclass_fields__)
fav_number fav_word
>>> Favs.fav_duck
<object at 0x7fffea519850>
根据PEP 557定义数据的含义类,
The dataclass
decorator examines the class to find fields. A field is defined as any variable identified in __annotations__
. That is, a variable that has a type annotation.
也就是说,这个问题的前提(例如“我如何使用 dataclass
没有类型注释的字段)必须被拒绝。术语 'field' 在上下文中dataclass
需要属性根据定义具有类型注释。
请注意,使用像 typing.Any
这样的通用类型注释与具有未注释的属性不同,因为该属性将出现在 __annotations__
.
中
最后,在仅提供属性名称的情况下,辅助函数 make_dataclass
将自动使用 typing.Any
作为类型注释,PEP 中也通过示例提到了这一点。
dataclass 装饰器通过在 __annotations__
中查找名称来检查 class 以查找字段。 It is the presence of annotation which makes the field,因此,您确实需要注释。
但是,您可以使用通用的:
@dataclass
class Favs:
fav_number: int = 80085
fav_duck: 'typing.Any' = object()
fav_word: str = 'potato'
当数据class中有一个字段类型可以是任何类型时,如何省略注释?
@dataclass
class Favs:
fav_number: int = 80085
fav_duck = object()
fav_word: str = 'potato'
上面的代码似乎并没有真正为 fav_duck
创建字段。它只是使它成为一个普通的旧 class 属性。
>>> Favs()
Favs(fav_number=80085, fav_word='potato')
>>> print(*Favs.__dataclass_fields__)
fav_number fav_word
>>> Favs.fav_duck
<object at 0x7fffea519850>
根据PEP 557定义数据的含义类,
The
dataclass
decorator examines the class to find fields. A field is defined as any variable identified in__annotations__
. That is, a variable that has a type annotation.
也就是说,这个问题的前提(例如“我如何使用 dataclass
没有类型注释的字段)必须被拒绝。术语 'field' 在上下文中dataclass
需要属性根据定义具有类型注释。
请注意,使用像 typing.Any
这样的通用类型注释与具有未注释的属性不同,因为该属性将出现在 __annotations__
.
最后,在仅提供属性名称的情况下,辅助函数 make_dataclass
将自动使用 typing.Any
作为类型注释,PEP 中也通过示例提到了这一点。
dataclass 装饰器通过在 __annotations__
中查找名称来检查 class 以查找字段。 It is the presence of annotation which makes the field,因此,您确实需要注释。
但是,您可以使用通用的:
@dataclass
class Favs:
fav_number: int = 80085
fav_duck: 'typing.Any' = object()
fav_word: str = 'potato'