【问题标题】:How to cast a variable to a dataclass type?如何将变量转换为数据类类型?
【发布时间】:2020-06-19 04:33:36
【问题描述】:

我想使用 dataclasses 模块中的函数 fields,但我的 IDE 一直警告我它只能用于数据类(类或实例)。我知道可以忽略警告,但我想将我的变量转换为数据类类型,因为它更具可读性和 IDE 兼容。

一个简单的例子:

from dataclasses import fields

all_fields = fields(some_instance) # Here I get a warning

上下文:

我想编写一个“mixin”类来为我的数据类添加类型强制。示例:

from typing import Any
from dataclasses import fields, Field     

class TypedDCMixin:
    def __post_init__(self):
        self._check_fields_types()

    def _check_fields_types(self):
        for field in fields(self): # HERE I get the warning from my IDE 
            field_value = getattr(self, field.name)
            self._check_field_type(field, field_value)

    def _check_field_type(self, field: Field, field_value: Any):
        # whatever
        pass

dataclasses.fields 与未知数据类的参数一起使用的任何其他上下文中都会出现相同的警告。

我通常通过使用函数typing.cast 来避免这样的类型警告,但是在警告行没有DataclassType 让我可以执行cast(DataclassType, self)

因此我的问题是:如何将变量转换为数据类类型?

【问题讨论】:

  • 我在您的代码中没有看到任何类。看看python.org/dev/peps/pep-0557
  • 变量some_instance 来自其他地方。我们可以假设它是一个数据类实例。
  • 我会同意克劳斯的请求。像这样的简单导入没有理由触发警告。它可能存在于您的数据类或字段函数的定义中。尝试创建另一个具有相同结构但虚拟内容的模块,以使用您可以在此处发布的内容来重现该问题。这也可能与“字段”名称的使用有关,但我对此表示怀疑。
  • 我添加了更多上下文。我希望现在更清楚了。

标签: python python-3.x python-dataclasses


【解决方案1】:

将 cast 与 dataclass 装饰器一起使用。

修改原始示例以添加强制转换:

from typing import Any, cast
from dataclasses import fields, Field, dataclass   

class TypedDCMixin:
    def __post_init__(self):
        self._check_fields_types()

    def _check_fields_types(self):
        for field in fields(cast(dataclass, self)): # Here the casting is used  
            field_value = getattr(self, field.name)
            self._check_field_type(field, field_value)

    def _check_field_type(self, field: Field, field_value: Any):
        # whatever
        pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2016-05-29
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2020-10-22
    相关资源
    最近更新 更多