数据类元素的默认值为“无”并键入-用法正确吗?

问题描述

我正在使用组合将一组数据类放在一起,以对复杂的嵌套数据结构进行建模。

我正在尝试使用mypy检查我编写的所有内容。

下面是我要做的一个简单示例:

from dataclasses import dataclass

@dataclass
class A:
    mean: float
    std: float

@dataclass
class B:
    value1: float
    value2: float

@dataclass
class Data:
    data_A: A = None
    data_B: B = None

在上面,我为None的元素设置了Data的默认值,以便可以在创建Data的元素之前实例化它,然后添加它们以后。

......在我的程序中,我先创建顶层结构,然后向其添加元素。 (与先创建单个元素,然后将它们全部传递给容器对象的初始化相反)

在我的程序中的用法如下:

some_data = Data()

a = A(mean=5,std=10)
b = B(value1=1.1,value2=2.2)

some_data.data_A = a
some_data.data_B = b

我需要在None的定义中将默认设置添加到Data,以便对构造函数的调用不会引发缺少参数的错误。

问题

尽管这可行,但是mypy并不满意,因为在我对Data的定义中,我在期望AB类型的地方分配了None类型。

修复

Optional[]的定义中添加Data可以解决问题:

from typing import Optional

@dataclass
class Data:
    data_A: Optional[A] = None
    data_B: Optional[B] = None

...如果我实例化不带任何参数的D:d = D(),mypy现在就没有问题。

发生了什么

尽管dataclass的语法使用类型来定义元素,但不会强制。它仅在创建实例时检查您是否通过了 something 。因此,以下所有内容都可以很愉快地工作(尽管mypy当然会将其标记为错误)。

a1 = A(mean=None,std=None)
a2 = A(mean='a string',std=True)

因此,当我将Data设置为具有特定类型A和B的元素时,但默认的None python将运行该元素,但mypy当然会将它们标记为不兼容的类型。

问题

鉴于我的程序流程(我想先创建顶级容器数据类,然后再向其添加元素)是最好/唯一/合理的方法来完成我的工作,并使用{{1 }}并结合默认值Optional[]

是否有其他/更好的处理方式?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...