2014-11-09 3 views
1

При разработке и отладке с помощью python/ipython repl в какой-то момент я хотел бы сбросить все локальные переменные в функции в рабочее пространство, чтобы посмотреть, что происходит. Предположим, у меня есть функцияПеременные функции дампа в рабочее пространство в python/ipython

def func(): 
    a = "blablabla" 
    b = 1234 
    c = some_calculation_of_a_and_b(a,b) 
    dump_to_workspace(a,b,c) # is this possible?, or even more preferable: 
    dump_all_local_variables_to_workspace() # is this possible? 

Я надеюсь, чтобы иметь возможность запускать это в Python/IPython:

>>> func() 
>>> print a 
"blablabla" 
>>> print b 
1234 
>>> print c 
some_calculated_value 

Я знаю два варианта: (1) возвращают переменные из функции [не очень хорошо, потому что Я не хочу испортить возвращаемое значение] и (2) сохранять данные в файл на диске [не удобно, потому что это связано с дисковым вводом-выводом с возможным большим количеством данных]. Но это не так удобно в большинстве случаев. Есть ли способ получить демпинг напрямую?

Большое спасибо!

+0

Лучше было бы использовать 'pdb.set_trace()' и шаг за шагом. – vikramls

+0

Привет @vikramls, это выглядит многообещающим направлением. Я должен определенно изучить и узнать больше о 'pdb'. Если у вас есть указатель на хороший учебник/справочник, это тоже будет здорово. Благодаря! –

+0

Я добавил ответ, чтобы подробно остановиться на использовании pdb. – vikramls

ответ

1

Чтобы развернуть на мой комментарий выше, вот краткое введение в PDB:

import pdb 
def func(): 
    a = "blablabla" 
    b = 1234 
    c = some_calculation_of_a_and_b(a,b) 
    pdb.set_trace() 

Для запуска:

python program.py

Интерпретатор затем остановится на pdb.set_trace() линии позволяя вам наблюдать значения a, b и c.

Во время остановки, вы можете распечатать значения локальных переменных, набрав:

p a 
p b 

и т.д. Полный список команд в PDB можно получить, набрав ? в PDB строке. Here - ссылка на библиотечную документацию.

0

У вас есть функция для этого:

print locals() 

и globals() для глобальных переменных

+0

Спасибо. Это очень близко к тому, что я имел в виду. Но я также хотел бы «сбросить»/экспортировать locals() в рабочую область, так что после возвращения функции я все равно могу проверить эти переменные. Любые идеи о том, как это сделать? –

0

можно использовать whos в IPython. vars() в среде python.

+0

Это, похоже, не работает. Мне нужно получить доступ к переменным внутри функции, а 'whos' или' vars() ', похоже, не позволяют мне это делать. Пожалуйста, поправьте меня, если я ошибаюсь. Благодарю. –

0

Чтобы добиться того, что непосредственно просил в вопросе, функция может return locals(), то вы можете обновить locals() в интерактивной среде:

def func(): 
    # define a,b,c 
    return locals() # or, more restrictively, return {'a':a, 'b':b, 'c':c} 

>>> locals().update(func()) 
Смежные вопросы