2024-10-04 05:29:17 发布
网友
#
换句话说,我想要一个函数
def echo(x): #magic goes here
如果被称为foo=7; echo(foo)(或者foo=7; echo('foo')),它将打印出foo 7。我意识到如果我把变量和它的名字都传给函数的话,这样做是微不足道的,但是我在调试时经常使用这样的函数,重复总是会让我恼火。在
foo=7; echo(foo)
foo=7; echo('foo')
foo 7
这里有一个解决方案,你可以输入更多的信息来调用它。它依赖于locals内置函数:
def print_key(dictionary, key): print key, '=', dictionary[key] foo = 7 print_key(locals(), 'foo')
使用inspect模块,还可以使用您提到的语义的echo。但是,请务必阅读inspect文档中的警告。这是一种丑陋的不可移植的黑客(它不适用于Python的所有实现)。请确保仅将其用于调试。在
echo
其思想是研究调用函数的locals。inspect模块只允许:调用由f_back属性链接在一起的帧对象表示。每个帧的局部和全局变量都是可用的(也有内置变量,但不太可能需要打印它们)。在
f_back
您可能希望显式删除任何引用帧对象以防止引用循环,如inspect docs中所述,但这并不是绝对必要的,垃圾回收迟早会释放它们。在
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')有问题):
echo('foo')
def echo(**kwargs): for name, value in kwargs.items(): print name, value foo = 7 echo(foo=foo)
更新:使用inspect的echo(foo)的解决方案
inspect
echo(foo)
输出:
foo 7 foo + bar 10 (foo + bar)*baz/(bar+foo) 11
它的呼叫最小,但对新行很敏感,例如:
echo((foo + bar)* baz/(bar+foo))
将打印:
baz/(bar+foo)) 11
这里有一个解决方案,你可以输入更多的信息来调用它。它依赖于locals内置函数:
使用inspect模块,还可以使用您提到的语义的
echo
。但是,请务必阅读inspect文档中的警告。这是一种丑陋的不可移植的黑客(它不适用于Python的所有实现)。请确保仅将其用于调试。在其思想是研究调用函数的locals。inspect模块只允许:调用由
f_back
属性链接在一起的帧对象表示。每个帧的局部和全局变量都是可用的(也有内置变量,但不太可能需要打印它们)。在您可能希望显式删除任何引用帧对象以防止引用循环,如inspect docs中所述,但这并不是绝对必要的,垃圾回收迟早会释放它们。在
^{pr2}$另请参见:https://stackoverflow.com/a/2387854/16361
请注意,这可能会导致GC问题:
http://docs.python.org/library/inspect.html#the-interpreter-stack
它也会让那些因乱弄相框而被烧焦的人反感,并可能在你嘴里留下不好的味道。但它会起作用的。在
不是真正的解决方案,但可能很方便(不管怎样,
echo('foo')
有问题):更新:使用
^{pr2}$inspect
的echo(foo)
的解决方案输出:
它的呼叫最小,但对新行很敏感,例如:
将打印:
相关问题 更多 >
编程相关推荐