如何找到传递给函数的变量的名称?

Jam*_*mes 8 python reflection variables

在C/C++中,我经常发现它在调试时有用,比如定义一个宏,ECHO(x)打印出变量名及其值(即ECHO(variable)可能打印variable 7).您可以使用"字符串化操作符的宏来得到变量名#描述这里.有没有办法在Python中这样做?

换句话说,我想要一个功能

def echo(x):
    #magic goes here
Run Code Online (Sandbox Code Playgroud)

如果被称为foo=7; echo(foo)(或foo=7; echo('foo')可能),将打印出来foo 7.我意识到如果我将变量及其名称都传递给函数,这样做是微不足道的,但是在调试时我会使用这样的函数,重复总是会让我感到恼火.

rec*_*dev 7

不是真的解决方案,但可能很方便(无论如何你有echo('foo')问题):

def echo(**kwargs):
    for name, value in kwargs.items():
        print name, value

foo = 7
echo(foo=foo)
Run Code Online (Sandbox Code Playgroud)

UPDATE:解决方案echo(foo)inspect

import inspect
import re

def echo(arg):
    frame = inspect.currentframe()
    try:
        context = inspect.getframeinfo(frame.f_back).code_context
        caller_lines = ''.join([line.strip() for line in context])
        m = re.search(r'echo\s*\((.+?)\)$', caller_lines)
        if m:
            caller_lines = m.group(1)
        print caller_lines, arg
    finally:
        del frame

foo = 7
bar = 3
baz = 11
echo(foo)
echo(foo + bar)
echo((foo + bar)*baz/(bar+foo))
Run Code Online (Sandbox Code Playgroud)

输出:

foo 7
foo + bar 10
(foo + bar)*baz/(bar+foo) 11
Run Code Online (Sandbox Code Playgroud)

它具有最小的调用,但它对换行符很敏感,例如:

echo((foo + bar)*
      baz/(bar+foo))
Run Code Online (Sandbox Code Playgroud)

将打印:

baz/(bar+foo)) 11
Run Code Online (Sandbox Code Playgroud)