Вот решение, которое заставляет вас набрать немного больше для его вызова. Он опирается на встроенную функцию locals :
def print_key(dictionary, key):
print key, '=', dictionary[key]
foo = 7
print_key(locals(), 'foo')
Также возможно echo
с упомянутой вами семантикой, используя модуль inspect . Тем не менее, прочитайте предупреждения в документации по проверке. Это уродливый непереносимый хак (он работает не во всех реализациях Python). Обязательно используйте его только для отладки.
Идея состоит в том, чтобы заглянуть в locals вызывающей функции. Модуль проверки допускает только это: вызовы представляются объектами фрейма, связанными друг с другом атрибутом f_back
. Доступны локальные и глобальные переменные каждого фрейма (также есть встроенные функции, но вам вряд ли придется их печатать).
Возможно, вы захотите явно удалить любые объекты рамки ссылок, чтобы предотвратить циклы ссылок, как описано в проверять документы , но это не является строго необходимым - сборщик мусора рано или поздно освободит их.
import inspect
def echo(varname):
caller = inspect.currentframe().f_back
try:
value = caller.f_locals[varname]
except KeyError:
value = caller.f_globals[varname]
print varname, '=', value
del caller
foo = 7
echo('foo')