第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何刪除數(shù)據(jù)類屬性

如何刪除數(shù)據(jù)類屬性

慕森卡 2022-06-07 19:23:18
我有一個(gè)這樣的數(shù)據(jù)類:@dataclassclass Bla:    arg1: Optional[int] = None    arg2: Optional[str] = None    arg3: Optional[Dict[str, str]] = None我想要這種行為:>>> bla = Bla(arg1=None, arg2=None, arg3=None)>>> asdict(bla){'arg1': None, 'arg2': None, 'arg3': None}>>> bla = Bla(){}在這種特定情況下,我可以使用 a dict,但我會(huì)失去擁有類型提示的可能性(并使用 mypy)所以我嘗試了這個(gè):class none:    ...@dataclassclass Bla:    arg1: Union[none, int] = none()    arg2: Union[none, str] = none()    arg3: Union[none, Dict[str, str]] = none()    def __post_init__(self) -> None:        for k, v in self.__dict__.copy().items():            if isinstance(v, none):                delattr(self, k)但結(jié)果是:>>> asdict(Bla()){'arg1': <__main__.none object at 0x7f71bc0159b0>, 'arg2': <__main__.none object at 0x7f71bc015a90>, 'arg3': <__main__.none object at 0x7f71bc015ac8>}我期待一個(gè)空的dict如果嘗試:>>> a = Bla(None, None, None)>>> del a.__dict__["arg1"]>>> asdict(a)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "/home/(....)/venv/lib/python3.6/site-packages/dataclasses.py", line 1011, in asdict    return _asdict_inner(obj, dict_factory)  File "/home/(...)/venv/lib/python3.6/site-packages/dataclasses.py", line 1018, in _asdict_inner    value = _asdict_inner(getattr(obj, f.name), dict_factory)AttributeError: 'Bla' object has no attribute 'arg1'如何以asdict之后可以使用的方式從數(shù)據(jù)類對(duì)象中動(dòng)態(tài)刪除屬性?
查看完整描述

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>


查看完整回答
反對(duì) 回復(fù) 2022-06-07
?
哆啦的時(shí)光機(jī)

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)什么。


查看完整回答
反對(duì) 回復(fù) 2022-06-07
  • 2 回答
  • 0 關(guān)注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)