2013-10-11 4 views
6

Я ищу способ быстро напечатать имя и значение переменной при быстром развитии/отладке небольшого скрипта python в командной строке unix/ssh.log имя переменной и значение

Это кажется очень распространенным требованием, и кажется бесполезным (по нажатию клавиш и времени/энергии) дублировать переменные_имя на каждой строке, которая печатает или регистрирует ее значение. т.е. вместо

print 'my_variable_name:', my_variable_name 

Я хочу, чтобы иметь возможность сделать следующее за ул, межды, список, Dict

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

и получить следующий вывод

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

идеально выход будет также запишите имя функции

Я видел некоторые решения, пытающиеся использовать местных жителей, глобальные, fr ames и т. д. Но я еще не видел что-то, что работает для ints, строк, списков и работает внутри функций тоже.

Благодаря

+1

Звучит как макрос ... –

+0

Почему бы не использовать pdb: http://docs.python.org/2/library/pdb.html? – lucasg

+1

Злые хаки: 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

ответ

6

Если инструмент нужен только для разработки и отладки, есть полезный пакет calle q.

Он был отправлен на pypi, его можно установить с pip install q или 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() 

Результатов выводятся в файл/TMP/д (или любые настроенные пути) по умолчанию, так что они не будут смешиваться с стандартным выводом и обычными бревнами. Вы можете проверить вывод с помощью tail -f /tmp/q. Вывод подсвечивается разными цветами.

Автор представил свою библиотеку в молниеносной речи PyconUS 2013. Видеоролик here, начинается в 25:15.

+1

Отличный инструмент. Я обязательно буду использовать это в будущем, спасибо за то, что вы указали это. Лично я предпочел бы иметь возможность отправлять вывод в stdout, но, возможно, для этого есть опция для q. – Sean

+0

@Sean Я тоже хотел бы отправить имя переменной и значение в stdout. Вы нашли способ? –

0

Я не знаю, какой-либо способ просто получить имя переменной строки. вы можете получить список аргументов текущего журнала синхронизации.

import inspect 

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

Нет. Это не то, о чем он просит. – thefourtheye

+0

@ thefourtheye На самом деле вы правы. это всегда будет печатать «а» как имя переменной ... – log0

4

Вот еще один злой хак:

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) 

Это, очевидно, были бы нужны некоторые проверки дальности, лучше синтаксический и т.д. Также работает только тогда, когда вызовы производится всегда таким же образом, и, вероятно, больше - неизвестно мне - предположения ...

+0

Действительно злой ...: P – thefourtheye

Смежные вопросы