如何在没有注释类型的情况下添加数据类字段?

问题描述 投票:8回答:2

当数据类中有一个类型可以是任何类型的字段时,如何省略注释?

@dataclass
class Favs:
    fav_number: int = 80085
    fav_duck = object()
    fav_word: str = 'potato'

看来上面的代码实际上并没有为fav_duck创建一个字段。它只是使它成为一个普通的旧类属性。

>>> Favs()
Favs(fav_number=80085, fav_word='potato')
>>> print(*Favs.__dataclass_fields__)
fav_number fav_word
>>> Favs.fav_duck
<object at 0x7fffea519850>
python annotations duck-typing python-3.7 python-dataclasses
2个回答
5
投票

数据类装饰器通过在__annotations__中查找名称来检查类以查找字段。 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'

-1
投票

根据定义数据类含义的PEP 557

dataclass装饰师检查班级以查找字段。字段定义为__annotations__中标识的任何变量。也就是说,具有类型注释的变量。

也就是说,这个问题的前提(例如“我如何使用没有类型注释的字段的dataclass)必须被拒绝。”dataclass上下文中的“字段”一词必须要求属性具有类型注释定义。

请注意,使用像typing.Any这样的泛型类型注释与具有未注释属性的注释不同,因为该属性将出现在__annotations__中。

最后,辅助函数make_dataclass将在仅提供属性名称的情况下自动使用typing.Any作为类型注释,并且在PEP中也提到了一个示例。

© www.soinside.com 2019 - 2024. All rights reserved.