Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 在dataclass上的自定义`\uuuuu init\uuuuuu`覆盖中调用生成的`\uuuuu init\uuuuuuuuuu`_Python_Python 3.x_Python Dataclasses - Fatal编程技术网

Python 在dataclass上的自定义`\uuuuu init\uuuuuu`覆盖中调用生成的`\uuuuu init\uuuuuuuuuu`

Python 在dataclass上的自定义`\uuuuu init\uuuuuu`覆盖中调用生成的`\uuuuu init\uuuuuuuuuu`,python,python-3.x,python-dataclasses,Python,Python 3.x,Python Dataclasses,目前我有这样的想法: @dataclass(冻结=真) 类别MyClass: a:str b:str c:str d:Dict[str,str] …这一切都很好,除了dicts是可变的,所以我不能用我的类为另一本词典键入关键字 相反,我希望fieldd类似于FrozenSet[Tuple[str,str]],但我仍然希望构建类实例的人能够在构造函数上传递字典,因为这更直观 所以我想做一些类似的事情 @dataclass(冻结=真) 类别MyClass: a:str b:str c:str d:

目前我有这样的想法:

@dataclass(冻结=真)
类别MyClass:
a:str
b:str
c:str
d:Dict[str,str]
…这一切都很好,除了
dict
s是可变的,所以我不能用我的类为另一本词典键入关键字

相反,我希望field
d
类似于
FrozenSet[Tuple[str,str]]
,但我仍然希望构建类实例的人能够在构造函数上传递字典,因为这更直观

所以我想做一些类似的事情

@dataclass(冻结=真)
类别MyClass:
a:str
b:str
c:str
d:FrozenSet[Tuple[str,str]]=field(init=False)
定义初始化(self,a,b,c,d:Dict[str,str]):
self.original_generated_init(a,b,c)#???
object.setattr(self'd',frozenset(d.items())#必需,因为我的数据类已冻结
我如何做到这一点?或者,有没有更优雅的方法来实现同样的目标?

您可以在以下位置使用和分配到
d

@dataclass(冻结=真)
类别MyClass:
a:str
b:str
c:str
d:FrozenSet[Tuple[str,str]]=field(init=False)
d_init:InitVar[Dict[str,str]]
定义后初始化(self,d_init):
对象。uuu setattr_uuuu(self,'d',frozenset(d_init.items())

来宾给出的答案是正确的,并且与基本数据类一样好,因为您必须始终围绕着这样一个事实,即它们是通过设计实现的。如果您想干净地使用这两个库中的任何一个,您必须使用第三方库,如,或

为了比较仅standardlib实现,我将向您展示数据类在pydantic中的外观。这是一个相对较新的框架,与其他两个框架相比,它的历史积淀要少得多:

输入import FrozenSet,Tuple
从pydantic导入数据类,验证程序
@dataclass.dataclass(冻结=真)
Foo类:
a:str
b:str
c:str
d:FrozenSet[Tuple[str,str]]
@验证器('d',pre=True)
def d_接受命令(cls,v):
“”“允许将dict作为冻结集传递的自定义验证器。”。
设置“pre”标志意味着它将在基本类型之前运行
进行验证,例如pydantic不会引发类型错误
为了通过口述而不是与生俱来的一致性,
例如列表或冻结集。
代码本身仅检查参数是否作为“d”庸医传递
就像一个口述,如果答案是“是”,就会转换它。
"""
尝试:
return frozenset(v.items())
除属性错误外:
返回v
安装和使用另一个库会增加一些复杂性,但如果您经常觉得您的数据类需要我链接的初始列表(或pydantic的商标特性,运行时类型断言)中的某些内容,那么这可能是值得的