1 回答

TA貢獻1835條經驗 獲得超7個贊
只要您使用的是 Python 3.6+,就可以使用與在不初始化變量的情況下用于“聲明”變量類型的相同語法任意地“重新注釋”變量的類型(PEP 526)。
在您提供的示例中,以下代碼段具有您期望的行為:
def do_something_to_A(a_in: A):
...
if a_in.is_b:
a_in: B
a_in.flummox()
我已經測試了PyCharm 2019.2是否正確檢測到了這種技術。
值得注意的是,這不會產生運行時成本,因為無論是否添加此注釋語句,都會生成相同的字節碼。鑒于以下定義,
def do_something_with_annotation(a_in: A):
if a_in.is_b:
a_in: B
a_in.flummox()
def do_something_without_annotation(a_in: A):
if a_in.is_b:
a_in.flummox()
dis 產生以下字節碼:
>>> dis.dis(do_something_with_annotation)
3 0 LOAD_FAST 0 (a_in)
2 LOAD_ATTR 0 (is_b)
4 POP_JUMP_IF_FALSE 14
5 6 LOAD_FAST 0 (a_in)
8 LOAD_ATTR 1 (flummox)
10 CALL_FUNCTION 0
12 POP_TOP
>> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>> dis.dis(do_something_without_annotation)
3 0 LOAD_FAST 0 (a_in)
2 LOAD_ATTR 0 (is_b)
4 POP_JUMP_IF_FALSE 14
4 6 LOAD_FAST 0 (a_in)
8 LOAD_ATTR 1 (flummox)
10 CALL_FUNCTION 0
12 POP_TOP
>> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
作為旁注,您還可以保留斷言語句,并通過調用帶有標志的解釋器在生產環境中禁用斷言。您的同事可能會或可能不會認為這更具可讀性,具體取決于他們對Python中類型提示的熟悉程度。-O
添加回答
舉報