給定的
>>> foo = [1, 1]
>>> bar = [1, 1, 1]
>>> print(foo[5], bar[5])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
我怎么知道哪個串列拋出了例外?
對于更不平凡的例子,這是非常令人惱火的。有人能解釋一下 Python 解釋器是如何作業的,以至于它無法記住它所在的字符嗎?這似乎是一個太明顯的設計錯誤,所以一定是有原因的,對吧?
uj5u.com熱心網友回復:
簡短的回答是你可以通過將你的列印陳述句分成多行來強制它(盡管我同意這更像是一種解決方法而不是真正的解決方案):
foo = [1, 1]
bar = [2, 2]
print(
foo[5],
bar[5]
)
應該導致類似:
Traceback (most recent call last):
File "test.py", line 4, in <module>
foo[5],
IndexError: list index out of range
dis另請注意,如果您想實際檢查位元組碼以查看發生了什么,該模塊可能會有所幫助:
import dis
code_block ='''
foo = [1, 1]
bar = [2, 2]
print(foo[5], bar[5])
'''
print(dis.dis(compile(code_block, "", "exec")))
Tells me:
2 0 LOAD_CONST 0 (1)
2 LOAD_CONST 0 (1)
4 BUILD_LIST 2
6 STORE_NAME 0 (foo)
3 8 LOAD_CONST 1 (2)
10 LOAD_CONST 1 (2)
12 BUILD_LIST 2
14 STORE_NAME 1 (bar)
4 16 LOAD_NAME 2 (print)
18 LOAD_NAME 0 (foo)
20 LOAD_CONST 2 (5)
22 BINARY_SUBSCR
24 LOAD_NAME 1 (bar)
26 LOAD_CONST 2 (5)
28 BINARY_SUBSCR
30 CALL_FUNCTION 2
32 POP_TOP
34 LOAD_CONST 3 (None)
36 RETURN_VALUE
None
所以,在我的平臺上,在foo[5]bar 之前評估(通過 BINARY_SUBSCR)。
uj5u.com熱心網友回復:
JonSG 的答案適用于所有版本的 Python。然而,在未來,Python 3.11 將在其位元組碼中存盤列偏移量。回溯將在出錯的運算式下劃線:
Traceback (most recent call last):
File "C:\Users\username\Documents\module.py", line 3, in <module>
print(foo[5], bar[5])
~~~^^^
IndexError: list index out of range
這要歸功于在 Python 3.11 中實作的PEP 657,目前處于 alpha 階段,并將于 2022 年 10 月發布。
請注意,此功能會帶來很小的記憶體成本,作者已承認這一點,并說:
我們知道某些用戶可能無法接受此資訊的額外成本,因此我們提出了一種選擇退出機制,該機制將導致生成的代碼物件沒有額外資訊,同時也允許 pyc 檔案不包含額外資訊。
可以通過傳遞-Xno_debug_ranges到來選擇退出此功能python。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318184.html
下一篇:將主要游戲回圈轉化為功能
