2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
PEP 572 描述了這樣做的目的(強(qiáng)調(diào)我的):
這是一個(gè)建議,旨在創(chuàng)建一種使用符號(hào) 為表達(dá)式中的變量賦值的方法
NAME := expr
。
self.foo
不是變量,而是對(duì)象的屬性。
語(yǔ)法和語(yǔ)義部分進(jìn)一步指定它:
NAME
是一個(gè)標(biāo)識(shí)符。
self.foo
不是標(biāo)識(shí)符,它是由.
運(yùn)算符分隔的兩個(gè)標(biāo)識(shí)符。
雖然我們經(jīng)常類(lèi)似地使用變量和屬性,有時(shí)會(huì)草率地稱(chēng)為self.foo
變量,但它們并不相同。分配給self.foo
實(shí)際上只是一個(gè)簡(jiǎn)寫(xiě)
setattr(self,?'foo',?temp)
這允許您定義屬性的 getter 和 setter。如果必須使用具有自定義設(shè)置器的屬性,則賦值表達(dá)式的規(guī)范和實(shí)現(xiàn)將會(huì)變得復(fù)雜。
例如,如果 setter 轉(zhuǎn)換所分配的值,則賦值表達(dá)式的值應(yīng)該是原始值還是轉(zhuǎn)換后的值?
另一方面,變量不能自定義。分配給變量始終具有相同的簡(jiǎn)單語(yǔ)義,并且表達(dá)式很容易計(jì)算出分配的值。
同樣,您不能將海象運(yùn)算符與切片分配一起使用。這是無(wú)效的:
foo1[2:4]?:=?foo2[1:3]

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
有趣的是,對(duì) walrussing object.attributes 的禁止似乎只存在于 Python 的解析器中,該解析器將文本代碼解析為抽象語(yǔ)法樹(shù)(ast),然后編譯和執(zhí)行該抽象語(yǔ)法樹(shù)。如果您手動(dòng)創(chuàng)建一個(gè) ast 語(yǔ)法樹(shù)并self.foo
替換var
in (var := temp)
and thencompile
或exec
該樹(shù),它會(huì)按照您直觀的預(yù)期進(jìn)行編譯和執(zhí)行。
顯然,底層功能是允許海象分配給 object.attributes,他們只是選擇不讓我們使用它,因?yàn)樗麄儞?dān)心這會(huì)讓人們編寫(xiě)令人困惑的代碼或其他東西。多謝...
所以無(wú)論如何,一個(gè)極端的(完全不推薦?。┙鉀Q方案是你做一些預(yù)編譯 ast-surgery 將你的 object.attribute 目標(biāo)拼接到你的海象運(yùn)算符中,然后它可能會(huì)按照你的預(yù)期運(yùn)行。(我發(fā)現(xiàn)這一點(diǎn)是因?yàn)槲乙呀?jīng)在做 ast-surgery,出于其他原因用 object.attributes 替換了簡(jiǎn)單變量,而且我很高興發(fā)現(xiàn)海象分配仍然有效?。?/p>
添加回答
舉報(bào)