歸納這些方法
由於我們已經實現了二元算術運算,因此歸納增強算術運算並不太複雜。
通過傳入二元算術運算函式,並做一些自省(以及處理可能發生的 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 disdis.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 非公平鎖保證 老的執行緒排隊使用鎖 但是無法保證新執...