问题描述
我正在使用组合将一组数据类放在一起,以对复杂的嵌套数据结构进行建模。
我正在尝试使用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
的定义中,我在期望A
和B
类型的地方分配了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 (将#修改为@)