Python 3.x 数据类元素没有默认值和类型-正确用法?
我正在使用组合来组合一组数据类,以对复杂的嵌套数据结构进行建模 我试着用mypy检查我写的所有东西 下面是我要做的一个简单例子:Python 3.x 数据类元素没有默认值和类型-正确用法?,python-3.x,python-typing,python-dataclasses,Python 3.x,Python Typing,Python Dataclasses,我正在使用组合来组合一组数据类,以对复杂的嵌套数据结构进行建模 我试着用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 = No
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
在上面,我为Data
的元素设置了一个默认值None
,这样我可以在创建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
我需要在Data
的定义中将默认设置添加到None
,这样调用构造函数就不会抛出缺少参数的错误
问题
虽然这样做有效,mypy
并不高兴,因为在我对Data
的定义中,我分配了一个None类型,它期望的类型是a
和B
修复
将Optional[]
添加到数据的定义中
可以解决以下问题:
from typing import Optional
@dataclass
class Data:
data_A: Optional[A] = None
data_B: Optional[B] = None
…如果我实例化没有参数的D,mypy现在就没有问题:D=D()
发生什么事?
虽然dataclass
有一种使用键入来定义元素的语法,但它并不强制执行该语法。它只检查您在创建实例时是否传递了某些内容。因此,下面的所有内容都可以很好地工作(当然,mypy会将其标记为错误)
因此,当我将Data
设置为具有特定类型A和B的元素时,默认值为None
python将运行它,但当然mypy会将它们标记为不兼容的类型
问题:
给定我的程序流,我想先创建顶级容器数据类,然后再向其中添加元素,这是完成我所做的工作的最佳/唯一/合理的方法,并将可选[]
与默认值无
结合使用
有什么不同/更好的处理方法吗?嗯,是的,这就是
可选的的用途。。。或者,正如mypy正确指出的那样,您的类型注释是错误的。因此,是的,在这里使用Optional
是正确的,Optional[T]
相当于Union[None,T]
唯一不同的方法是更改程序流,以便在实例化数据时,a
和b
已经存在。如果数据
无法有意义地保存无
,则此练习可能已指出代码中的潜在问题。谢谢。数据可能毫无意义地不包含任何内容,因此从程序逻辑的角度来看,它不是不正确的用法。从流的角度来看,实际上我的单个数据元素是复杂的,是通过分析一组图像创建的,其中有很多图像,因此我的流是在一开始创建一个没有填充的容器,然后在运行时添加元素。另一种方法是在我进行测试时管理元素集合,然后在最后创建容器。一个六个,另一个半打,我猜
a1 = A(mean=None, std=None)
a2 = A(mean='a string', std=True)