設想這樣簡單的函數創建的變量default
的修改值,modified
:功能(拔本地變量out)
default = 0
def modify():
modified = default + 1
print(modified) # replace with OS call, I can't see the output
modify() # 1
default # 0
拆卸:
import dis
dis.dis(modify)
2 0 LOAD_GLOBAL 0 (default)
3 LOAD_CONST 1 (1)
6 BINARY_ADD
7 STORE_FAST 0 (modified)
3 10 LOAD_GLOBAL 1 (print)
13 LOAD_FAST 0 (modified)
16 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
19 POP_TOP
20 LOAD_CONST 0 (None)
23 RETURN_VALUE
我不能改變功能modify()
,但我知道它直接的(我可以看到代碼)或間接(拆卸)。我需要的是得到modified
變量的值,所以我雖然也許有一種方法如何通過dis
模塊刪除功能的特定部分(print(modified)
),但我沒有發現任何東西。
有沒有什麼辦法可以刪除可能的所有東西,除了16 CALL_FUNCTION
之後的return_value
,並且用例如16 CALL_FUNCTION
代替它。 return modified
?或者還有什麼其他的方式如何在沒有實際執行最後一行的情況下拉出局部變量?
作爲一個可能的解決方案我看到3種方式:
- 拉拆解代碼和創建我自己的函數(或就地)根據他們刪除代碼,我不想(
16 ...
後一切) - 修改函數的返回值,以便它返回
modified
(不幸調用OS功能) - 根據源代碼 手動重新創建功能
我想避免第二種方式,這可能是比第一個更容易,但我必須避免的第三條道路,所以......有什麼辦法如何解決我的問題呢?
即不是變量的修改版本。這是一個全新的對象 –
@MosesKoledoye編輯(我的意思是價值)。 – KeyWeeUsr
有第四種選擇:替換'print()'全局。 '打印= [];打印=拉姆達* ARGS:printed.extend(參數)',然後運行'修改()'和,optionaly,'德爾print'去除遮蔽全球。 –