2013-10-11 15 views
6

Szukam sposobu szybkiego drukowania nazwy zmiennej i wartości podczas szybkiego rozwijania/debugowania małego skryptu Pythona na linii poleceń/sesji ssh uniks.log nazwa zmiennej i wartość

Wydaje się, że jest to bardzo powszechny wymóg i wydaje się, że w przypadku każdej linii, która drukuje lub rejestruje wartość, wydaje się nieekonomiczna (przy naciśnięciach klawiszy i czasie/energii). czyli zamiast

print 'my_variable_name:', my_variable_name 

Chcę być w stanie wykonać następujące czynności na str, int, liście, dict

log(my_variable_name) 
log(i) 
log(my_string) 
log(my_list) 

i uzyskać następujące dane wyjściowe

my_variable_name:some string 
i:10 
my_string:a string of words 
my_list:[1, 2, 3] 

idealnie wyjście byłoby również logować nazwę funkcji

Widziałem kilka rozwiązań próbujących użyć locals, globals, fr ames itp., Ale jeszcze nie widziałem czegoś, co działa na ints, ciągi, listy i działa również w funkcjach.

Dzięki

+1

Brzmi jak makro ... –

+0

dlaczego nie używać pdb: http://docs.python.org/2/library/pdb.html? – lucasg

+1

Evil Hacks: http://stackoverflow.com/questions/932818/retrieving-a-variables-name-in-python-at-runtime, http://stackoverflow.com/questions/2553354/how-to-get- a-variable-name-as-a-string-in-python – doctorlove

Odpowiedz

6

Jeśli potrzebne narzędzie służy tylko do wywoływania i debugowania, istnieje przydatna paczka calle q.

Został przesłany do pypi, może być zainstalowany z pip install q lub easy_install q.

import q; q(foo) 

# use @q to trace a function's arguments and return value 
@q 
def bar(): 
    ... 

# to start an interactive console at any point in your code: 
q.d() 

Wyniki są wyprowadzane do pliku/tmp/Q (lub jakichkolwiek niestandardowych ścieżek) domyślnie, dlatego nie są mieszane ze standardowym wyjściu i normalnych kłód. Możesz sprawdzić wynik za pomocą tail -f /tmp/q. Dane wyjściowe są wyróżnione różnymi kolorami.

Autor przedstawił swoją bibliotekę w błyskawicznym przemówieniu PyconUS 2013. Film wideo to here, rozpoczyna się o 25:15.

+1

Doskonałe narzędzie. Na pewno skorzystam z tego w przyszłości, dziękuję za wskazanie tego. Osobiście wolałbym móc wysłać dane wyjściowe na standardowe wyjście, ale być może istnieje opcja q. – Sean

+0

@Sean Ja też chciałbym wysłać nazwę zmiennej i jej wartość do stdout. Czy znalazłeś sposób? –

0

ja nie znam żadnego sposobu, aby po prostu uzyskać nazwę zmiennej łańcucha. można jednak uzyskać listę argumentów bieżącego dziennika fonkcji.

import inspect 

def log(a): 
    frame = inspect.currentframe() 
    args, _, _, values = inspect.getargvalues(frame) 
    print "%s:%s" % (args[0], values[args[0]]) 
+0

Nie. Nie o to pyta. – thefourtheye

+0

@ thefourtheye W rzeczywistości masz rację. to zawsze będzie drukować "a" jako nazwę zmiennej ... – log0

4

Oto kolejna zła Hack:

import inspect 

def log(a): 
    call_line = inspect.stack()[1][4][0].strip() 
    assert call_line.strip().startswith("log(") 
    call_line = call_line[len("log("):][:-1] 
    print "Log: %s = %s" % (call_line, a) 

b=3 
log(b) 

To oczywiście musiałby pewne kontrole zasięgu, lepsze parsowanie itp działa również tylko wtedy, gdy połączenia są wykonane zawsze w ten sam sposób i ma prawdopodobnie więcej - nieznane mi - założenia ...

+0

Naprawdę złe ...: P – thefourtheye