簡體   English   中英

如何在數據類中使用 field()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM