2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
這不是您關(guān)于從數(shù)據(jù)類中刪除屬性的問題的答案,但它提供了一種機(jī)制來獲取以asdict您想要的方式運(yùn)行的自定義:
from dataclasses import dataclass
from typing import Optional, Dict, cast
SENTINEL = cast(None, object()) # have a sentinel that pretends to be 'None'
@dataclass
class Bla:
arg1: Optional[int] = SENTINEL
arg2: Optional[str] = SENTINEL
arg3: Optional[Dict[str, str]] = SENTINEL
def asdict(self):
return {k: v for k, v in self.__dict__.items() if v is not SENTINEL}
一些測試:
>>> Bla().asdict()
{}
>>> Bla(None, None).asdict()
{'arg1': None, 'arg2': None}
>>> Bla(1, 'foo', None).asdict()
{'arg1': 1, 'arg2': 'foo', 'arg3': None}
但請(qǐng)記住,這一切都是謊言,當(dāng)顯式調(diào)用時(shí),這些屬性仍然存在:
>>> print(Bla().arg1)
<object object at 0x7fc89ed84250>

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
我的問題是關(guān)于如何以dataclasses.dataclass我可以使用該函數(shù)dataclasses.asdict生成字典的方式從對(duì)象中刪除屬性。
我的用例是很多模型,我想以易于序列化和類型提示的方式存儲(chǔ)它們,但有可能省略元素(沒有任何默認(rèn)值)。我的第一種方法是找出一種方法來刪除我沒有在dataclass構(gòu)造函數(shù)中明確傳遞的任何項(xiàng)目。
然而,正如Patrick 和 Arne 明智地指出的那樣,嘗試使用dataclasses.
我發(fā)現(xiàn)解決我的用例的最佳方法是TypedDict從typing_extensions模塊中使用,它與PEP 589一起成為Python 3.8typing模塊中標(biāo)準(zhǔn)庫的一部分。
在 Python 3.8 中:
from typing import TypedDict, Dict
class Bla(TypedDict):
arg1: int
arg2: str
arg3: Dict[str, str]
在其他版本中,您必須安裝typing_extensions模塊:
pip install typing-extensions
然后:
from typing_extensions import TypedDict
我們?cè)囋嚳矗?/p>
>>> Bla(arg1=1, arg2="bla", arg3={"bla":"bla"})
{'arg1': 1, 'arg2': 'bla', 'arg3': {'bla': 'bla'}}
>>> Bla(arg1=1, arg2="bla")
{'arg1': 1, 'arg2': 'bla'}
>>> Bla(arg1=1)
{'arg1': 1}
非常優(yōu)雅,非常適合我的用例。
唯一的缺點(diǎn)是TypedDict還不支持默認(rèn)值。有一個(gè)公關(guān),我希望他們能做點(diǎn)什么。
添加回答
舉報(bào)