2 回答

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

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