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.我意识到如果我将变量及其名称都传递给函数,这样做是微不足道的,但是在调试时我会使用这样的函数,重复总是会让我感到恼火.
不是真的解决方案,但可能很方便(无论如何你有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)
| 归档时间: |
|
| 查看次数: |
1888 次 |
| 最近记录: |