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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Python的walrus運(yùn)算符不能用來設(shè)置實(shí)例屬性?

為什么Python的walrus運(yùn)算符不能用來設(shè)置實(shí)例屬性?

喵喵時光機(jī) 2023-09-05 20:33:45
我剛剛了解到新的海象運(yùn)算符 ( :=) 不能用于設(shè)置實(shí)例屬性,它被認(rèn)為是無效語法(引發(fā) a SyntaxError)。為什么是這樣? (您能提供提到這一點(diǎn)的官方文檔的鏈接嗎?)我瀏覽了PEP 572,但找不到是否/在哪里記錄了這一點(diǎn)。研究這個答案提到了這個限制,但沒有解釋或來源:您不能對對象屬性使用海象運(yùn)算符示例代碼class Foo:    def __init__(self):        self.foo: int = 0    def bar(self, value: int) -> None:        self.spam(self.foo := value)  # Invalid syntax    def baz(self, value: int) -> None:        self.spam(temp := value)        self.foo = temp    def spam(self, value: int) -> None:        """Do something with value."""嘗試將Foo結(jié)果導(dǎo)入SyntaxError:    self.spam(self.foo := value)              ^SyntaxError: cannot use assignment expressions with attribute
查看完整描述

2 回答

?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個贊

PEP 572 描述了這樣做的目的(強(qiáng)調(diào)我的):

這是一個建議,旨在創(chuàng)建一種使用符號 為表達(dá)式中的變量賦值的方法NAME := expr。

self.foo不是變量,而是對象的屬性。

語法和語義部分進(jìn)一步指定它:

NAME是一個標(biāo)識符。

self.foo不是標(biāo)識符,它是由.運(yùn)算符分隔的兩個標(biāo)識符。

雖然我們經(jīng)常類似地使用變量和屬性,有時會草率地稱為self.foo變量,但它們并不相同。分配給self.foo實(shí)際上只是一個簡寫

setattr(self,?'foo',?temp)

這允許您定義屬性的 getter 和 setter。如果必須使用具有自定義設(shè)置器的屬性,則賦值表達(dá)式的規(guī)范和實(shí)現(xiàn)將會變得復(fù)雜。

例如,如果 setter 轉(zhuǎn)換所分配的值,則賦值表達(dá)式的值應(yīng)該是原始值還是轉(zhuǎn)換后的值?

另一方面,變量不能自定義。分配給變量始終具有相同的簡單語義,并且表達(dá)式很容易計(jì)算出分配的值。

同樣,您不能將海象運(yùn)算符與切片分配一起使用。這是無效的:

foo1[2:4]?:=?foo2[1:3]


查看完整回答
反對 回復(fù) 2023-09-05
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個贊

有趣的是,對 walrussing object.attributes 的禁止似乎只存在于 Python 的解析器中,該解析器將文本代碼解析為抽象語法樹(ast),然后編譯和執(zhí)行該抽象語法樹。如果您手動創(chuàng)建一個 ast 語法樹并self.foo替換varin (var := temp)and thencompileexec該樹,它會按照您直觀的預(yù)期進(jìn)行編譯和執(zhí)行。

顯然,底層功能是允許海象分配給 object.attributes,他們只是選擇不讓我們使用它,因?yàn)樗麄儞?dān)心這會讓人們編寫令人困惑的代碼或其他東西。多謝...

所以無論如何,一個極端的(完全不推薦?。┙鉀Q方案是你做一些預(yù)編譯 ast-surgery 將你的 object.attribute 目標(biāo)拼接到你的海象運(yùn)算符中,然后它可能會按照你的預(yù)期運(yùn)行。(我發(fā)現(xiàn)這一點(diǎn)是因?yàn)槲乙呀?jīng)在做 ast-surgery,出于其他原因用 object.attributes 替換了簡單變量,而且我很高興發(fā)現(xiàn)海象分配仍然有效!)


查看完整回答
反對 回復(fù) 2023-09-05
  • 2 回答
  • 0 關(guān)注
  • 268 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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