【问题标题】:How to add a dataclass field without annotating the type?如何在不注释类型的情况下添加数据类字段?
【发布时间】:2018-09-30 13:09:57
【问题描述】:

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

@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>

【问题讨论】:

  • dataclasses 的替代品,属性为鸭子类型:attrs.org

标签: python annotations duck-typing python-3.7 python-dataclasses


【解决方案1】:

数据类装饰器通过在__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'

【讨论】:

    【解决方案2】:

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

    dataclass 装饰器检查类以查找字段。字段定义为__annotations__ 中标识的任何变量。即具有类型注释的变量。

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

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

    最后,辅助函数make_dataclass会在只提供属性名的情况下自动使用typing.Any作为类型注解,这在PEP中也有例子提到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-20
      • 2020-10-26
      • 1970-01-01
      • 2020-10-17
      • 2017-05-11
      • 2018-11-03
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多