增強算術賦值 「 」操作是怎麼實現的?

2021-10-09 22:15:25 字數 2125 閱讀 5542

歸納這些方法

由於我們已經實現了二元算術運算,因此歸納增強算術運算並不太複雜。

通過傳入二元算術運算函式,並做一些自省(以及處理可能發生的 typeerror),它可以被漂亮地歸納成:

def _create_binary_inplace_op(binary_op: _binaryop) -> callable[[any, any], any]:

binary_operation_name = binary_op.__name__[2:-2]

method_name = f"__i__"

operator = f"="

def binary_inplace_op(lvalue: any, rvalue: any, /) -> any:

lvalue_type = type(lvalue)

try:

method = debuiltins._mro_getattr(lvalue_type, method_name)

except attributeerror:

pass

else:

value = method(lvalue, rvalue)

if value is not notimplemented:

return value

try:

return binary_op(lvalue, rvalue)

except typeerror as exc:

# if the typeerror is due to the binary arithmetic operator, suppress

if exc._binary_op != binary_op._operator:

raise

raise typeerror(

f"unsupported operand type(s) for : and "

)binary_inplace_op.__name__ = binary_inplace_op.__qualname__ = method_name

binary_inplace_op.__doc__ = (

f"""implement the augmented arithmetic assignment `a b`."""

)return binary_inplace_op

這使得定義的 -= 支援 create_binary_inplace_op(_ sub__),且可以推斷出其它內容:函式名、呼叫什麼i*函式,以及當二元算術運算出問題時,該呼叫哪個可呼叫物件。

我發現幾乎沒有人使用**=

在寫本文的**時,我碰上了 **= 的乙個奇怪的測試錯誤。在所有確保pow會被適當地呼叫的測試中,有個測試用例對於 python 標準庫中的operator 模組卻是失敗。

我的**通常沒問題,如果**與 cpython 的**之間存在差異,通常會意味著是我**出錯了。

但是,無論我多麼仔細地排查**,我都無法定位出為什麼我的測試會通過,而標準庫則失敗。

我決定深入地了解 cpython 內部發生了什麼。從反彙編位元組碼開始:

def test(): a **= b

import dis

dis.dis(test)

1 0 load_fast 0 (a)

2 load_global 0 (b)

4 inplace_power

6 store_fast 0 (a)

8 load_const 0 (none)

10 return_value

通過它,我找到了在 eval 迴圈中的inplace_power:

case target(inplace_power):
出處:

然後找到pynumber_inplacepower():

pyobject *

pynumber_inplacepower(pyobject *v, pyobject *w, pyobject *z)

else

}亞馬遜測評 www.yisuping.com

在VB裡怎麼實現移位的算術運算操作

vb沒有提供移位操作的指令和函式,只提供and 與 or 或 xor 異或 eqv 同或 not 非 等幾個運算子,而程式設計時有時需要對乙個位元組進行移位操作 如進行加密 怎麼辦?其實只用and or二個運算子即可搞掂。例如要將變數byte1的第八位置1 假設byte1的二進位制值為0100110...

ECMAScript 6 的解構賦值是怎麼回事

學習解構賦值的時候,我想到了以前的一道題 a,b 兩個變數,不用第三個變數來切換兩個變數的值 var a 10,b 20 a b a.a a a.b console.log a 20 console.log b 10 var a 10,b 20 a a,b b a 0 a a 1 console.l...

ReenterLock內部是怎麼實現的

reentrantlock內部有公平鎖和非公平鎖兩種,而這兩種鎖都是基於aqs同步器實現的。aqs同步器太難看懂,先簡單看下reentrantlock的原始碼,再反推回去看aqs。1 公平鎖能保證 老的執行緒排隊使用鎖,新執行緒仍然排隊使用鎖。2 非公平鎖保證 老的執行緒排隊使用鎖 但是無法保證新執...