Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 数据类元素没有默认值和类型-正确用法?_Python 3.x_Python Typing_Python Dataclasses - Fatal编程技术网

Python 3.x 数据类元素没有默认值和类型-正确用法?

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

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

我试着用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
在上面,我为
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)