Я пытаюсь проанализировать некоторый грязный код, который довольно часто использует глобальные переменные внутри функций (я пытаюсь реорганизовать код, чтобы функции использовали только локальные переменные). Есть ли способ обнаружить глобальные переменные внутри функции?Обнаруживать все глобальные переменные в функции python?
Например:
def f(x):
x = x + 1
z = x + y
return z
Здесь глобальная переменная не y
, так как это не дано в качестве аргумента, и ни оно создается внутри функции.
Я попытался обнаружить глобальные переменные внутри функции, используя синтаксический анализ строк, но он немного запутался; Мне было интересно, есть ли лучший способ сделать это?
Edit: Если кому-то интересно, это код, я использую для определения глобальных переменных (на основе ответа 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
по умолчанию не return output, поэтому, если вы хотите манипулировать выводом dis
в качестве строки, вы должны использовать декоратор захвата, написанный Paolo, и размещен здесь: Capture stdout from a script in Python
Как бы то ни было, я также написал способ захвата stdout. :-) http://stackoverflow.com/a/16571630/416467 – kindall