我想分析一些凌亂的代碼,這恰好在函數中使用全局變量相當沉重(我試圖重構代碼,以便函數只使用局部變量)。有什麼方法可以檢測函數內的全局變量嗎?檢測python函數中的所有全局變量?
例如:
def f(x):
x = x + 1
z = x + y
return z
這裏全局變量是y
,因爲它不作爲參數給出的,並且也不是該函數內創建的。
我試圖使用字符串解析來檢測函數內的全局變量,但它變得有點混亂;我想知道是否有更好的方法來做到這一點?
編輯:如果有人有興趣,這是我使用來檢測全局變量的代碼(基於kindall的答案和保羅的回答這個問題:Capture stdout from a script in Python):
from dis import dis
def capture(f):
"""
Decorator to capture standard output
"""
def captured(*args, **kwargs):
import sys
from cStringIO import StringIO
# setup the environment
backup = sys.stdout
try:
sys.stdout = StringIO() # capture output
f(*args, **kwargs)
out = sys.stdout.getvalue() # release output
finally:
sys.stdout.close() # close the stream
sys.stdout = backup # restore original stdout
return out # captured output wrapped in a string
return captured
def return_globals(f):
"""
Prints all of the global variables in function f
"""
x = dis_(f)
for i in x.splitlines():
if "LOAD_GLOBAL" in i:
print i
dis_ = capture(dis)
dis_(f)
dis
默認情況下不返回輸出,所以如果你想操作dis
作爲一個字符串的輸出,你必須使用Paolo寫的捕獲裝飾器,併發布在這裏:Capture stdout from a script in Python
碰巧我還寫了一種捕獲stdout的方法。 :-) http://stackoverflow.com/a/16571630/416467 – kindall