[英]How to declare python dataclass member field same as the dataclass type
[英]How to use field() in dataclass?
我經常看到這樣的代碼:
@dataclass
class ClassName:
list_name: list[int] = field(default_factory=list)
但我不明白為什么我需要輸入field(default_factory=list)
。 list_name: list[int]
還不夠嗎?
您能否解釋一下何時、為什么以及如何在數據類中使用 field()?
正在做:
list_name: list[int]
不一樣:
list_name: list[int] = field(default_factory=list)
后者使用default_factory
,所以注意:
>>> from dataclasses import dataclass
>>> @dataclass
... class ClassName:
... list_name: list[int]
...
>>> ClassName()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'list_name'
但是如果你使用默認工廠:
>>> @dataclass
... class ClassName:
... list_name: list[int] = field(default_factory=list)
...
>>> ClassName()
ClassName(list_name=[])
注意,如果你做了list_name: list[int] = []
那么它會為每個實例重復使用相同的list
object ,幾乎肯定不是你想要的。 實際上, dataclass
裝飾器明確拒絕了這一點:
>>> @dataclass
... class ClassName:
... list_name: list[int] = []
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/Users/juanarrivillaga/opt/miniconda3/envs/py39/lib/python3.9/dataclasses.py", line 1021, in dataclass
return wrap(cls)
File "/Users/juanarrivillaga/opt/miniconda3/envs/py39/lib/python3.9/dataclasses.py", line 1013, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen)
File "/Users/juanarrivillaga/opt/miniconda3/envs/py39/lib/python3.9/dataclasses.py", line 863, in _process_class
cls_fields = [_get_field(cls, name, type)
File "/Users/juanarrivillaga/opt/miniconda3/envs/py39/lib/python3.9/dataclasses.py", line 863, in <listcomp>
cls_fields = [_get_field(cls, name, type)
File "/Users/juanarrivillaga/opt/miniconda3/envs/py39/lib/python3.9/dataclasses.py", line 747, in _get_field
raise ValueError(f'mutable default {type(f.default)} for field '
ValueError: mutable default <class 'list'> for field list_name is not allowed: use default_factory
通常,當您需要修改單個字段時,您會顯式使用dataclasses.field
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.