Próbuję przeanalizować trochę niechlujnego kodu, który zdarza się używać zmiennych globalnych całkiem mocno w funkcjach (próbuję zreorganizować kod, aby funkcje używały zmiennych lokalnych). Czy istnieje sposób na wykrycie zmiennych globalnych w funkcji?Wykrywanie wszystkich zmiennych globalnych w funkcji Pythona?
Na przykład:
def f(x):
x = x + 1
z = x + y
return z
Tutaj zmienna globalna jest y
ponieważ nie jest podany jako argument, i nie jest on stworzony w ramach funkcji.
Próbowałem wykryć globalne zmienne w funkcji za pomocą analizy parsowania, ale robiło się trochę nieporządnie; Zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego?
Edycja: Jeśli ktoś jest zainteresowany to jest kod używam wykryć zmienne globalne (na podstawie odpowiedzi kindall i odpowiedzi Paola na to pytanie: 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
domyślnie nie return output, więc jeśli chcesz manipulować wyjściem dis
jako ciągiem, musisz użyć dekoratora przechwytywania napisanego przez Paolo i opublikowanego tutaj: Capture stdout from a script in Python
Tak jak to się stało, napisałem również sposób na przechwytywanie stdout. :-) http://stackoverflow.com/a/16571630/416467 – kindall