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

2024-10-04 05:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

<>在C/C++中,我经常发现在调试时有用,定义宏,比如^ {CD1>},打印变量名及其值(即{{CD2>}可能打印^ {CD3>})。您可以使用'stringize'运算符#在宏中获得变量名,如here所述。在Python中有这样的方法吗?在

换句话说,我想要一个函数

def echo(x):
    #magic goes here

如果被称为foo=7; echo(foo)(或者foo=7; echo('foo')),它将打印出foo 7。我意识到如果我把变量和它的名字都传给函数的话,这样做是微不足道的,但是我在调试时经常使用这样的函数,重复总是会让我恼火。在


Tags: 方法函数echohere定义foodefmagic
3条回答

这里有一个解决方案,你可以输入更多的信息来调用它。它依赖于locals内置函数:

def print_key(dictionary, key):
    print key, '=', dictionary[key]


foo = 7
print_key(locals(), 'foo')

使用inspect模块,还可以使用您提到的语义的echo。但是,请务必阅读inspect文档中的警告。这是一种丑陋的不可移植的黑客(它不适用于Python的所有实现)。请确保仅将其用于调试。在

其思想是研究调用函数的locals。inspect模块只允许:调用由f_back属性链接在一起的帧对象表示。每个帧的局部和全局变量都是可用的(也有内置变量,但不太可能需要打印它们)。在

您可能希望显式删除任何引用帧对象以防止引用循环,如inspect docs中所述,但这并不是绝对必要的,垃圾回收迟早会释放它们。在

^{pr2}$
def echo(x):
    import inspect
    print "{0}: {1}".format(x, inspect.stack()[1][0].f_locals[x])
y = 123
echo('y')
# 'y: 123'

另请参见:https://stackoverflow.com/a/2387854/16361

请注意,这可能会导致GC问题:

http://docs.python.org/library/inspect.html#the-interpreter-stack

它也会让那些因乱弄相框而被烧焦的人反感,并可能在你嘴里留下不好的味道。但它会起作用的。在

不是真正的解决方案,但可能很方便(不管怎样,echo('foo')有问题):

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

foo = 7
echo(foo=foo)

更新:使用inspectecho(foo)的解决方案

^{pr2}$

输出:

foo 7
foo + bar 10
(foo + bar)*baz/(bar+foo) 11

它的呼叫最小,但对新行很敏感,例如:

echo((foo + bar)*
      baz/(bar+foo))

将打印:

baz/(bar+foo)) 11

相关问题 更多 >