[英]How to make List in python dataclass that can accept multiple different types?
我正在 python 中创建新的数据类。
@dataclass
class User(Mixin):
id: int = None
items: List[DefaultItem] = None
这个items
是DefaultItem
对象的数组,但我需要它是多个可能的对象,例如:
items: List[DefaultItem OR SomeSpecificItem OR SomeOtherItem] = None
我怎么能在python中做这样的事情?
您可以为此使用typing.Union
。
items: List[Union[DefaultItem, SomeSpecificItem, SomeOtherItem]] = None
如果您使用的是 Python 3.10,他们会添加一个方便的速记符号:
items: list[DefaultItem | SomeSpecificItem | SomeOtherItem] = None
另请注意:如果允许items
为None
,则应将类型标记为Optional
。
另外,请注意,在 Python 3.10 中,您还可以将kw_only
参数传递给@dataclass
装饰器以解决我怀疑您遇到的问题,其中子类中的所有字段都需要具有默认值在超类中至少有一个具有默认值的字段,在这种情况下是Mixin
。
我在下面添加了一个例子来更好地说明这一点:
from dataclasses import dataclass
@dataclass
class Mixin:
string: str
integer: int = 222
@dataclass(kw_only=True)
class User(Mixin):
id: int
items: list['A | B | C']
class A: ...
class B: ...
class C: ...
u = User(string='abc', id=321, integer=123, items=[])
print(u)
请注意,我还将Union
参数包装在一个字符串中,因此该表达式是前向声明的(即尚未计算),因为Union
参数中的类是稍后定义的。
此代码在 3.10 中有效,因为启用了kw_only
参数,因此现在构造函数只接受关键字参数。 这允许您解决上述问题,否则当父类中至少有一个默认字段时,您需要为子类中的所有字段定义默认值。
在早期的Python版本比3.10,缺少kw_only
说法,你希望碰到一个TypeError
如下:
TypeError: non-default argument 'id' follows default argument
在 3.10 之前的场景中解决此问题的方法正是您所拥有的:为User
类中的所有字段定义一个默认值,如下所示。
from __future__ import annotations
from dataclasses import dataclass, field
@dataclass
class Mixin:
string: str
integer: int = 222
@dataclass
class User(Mixin):
id: int = None
items: list[A | B | C] = field(default_factory=list)
class A: ...
class B: ...
class C: ...
u = User('abc', 123, 321)
print(u)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.