这个问题与此处提出的其他问题相似,但在阅读完答案之后,我并没有理解它,并希望得到进一步的指导。
在草拟新代码时,我发现自己添加了许多语句,如:
print('var=')
pprint(var)
总是写这个很乏味,所以我想我可以把它变成一个功能。由于我想在前一行打印变量名,我尝试了:
def dbp(var):
eval('print(\'{0}=\')'.format(var))
eval('pprint({0})'.format(var))
然后我做了以下的事情:
foo = 'bar'
dbp('foo')
打印
foo=
'bar'
这一切都很棒,但是当我在一个函数中使用它时,事情变得混乱了。例如,做
def f():
a = ['123']
dbp('a')
f()
引发NameError(NameError:name' a'未定义)。
我的期望是dbp()可以读取f()范围内的任何内容,但显然它没有。有人可以解释原因吗?
此外,还可以了解更好的打印变量名称后跟其格式化内容的方法。
答案 0 :(得分:1)
你真的应该考虑其他方法来做这件事
logging
模块是一个非常好的习惯,你可以关闭和调试输出
Python 3.6有f''
个字符串,因此您可以将其简化为:
pprint(f'var=\n{var}`)`
但是,这是一个使用locals()
的示例(不推荐):
In []:
def dbp(var, l):
print('{}='.format(var))
pprint(l[var])
def f():
a = 1
dbp('a', locals())
f()
Out[]:
a=
1
答案 1 :(得分:-1)
首先,id喜欢说eval对于那些将要运行该代码的人来说是一个很高的安全风险。
但是,如果你绝对必须,你可以这样做。
def dbp(var):
env = {'var': var}
# Adding global variables to the enviroment
env.update(globals())
eval("print('{0}=')".format(var))
eval('pprint(var)', env)
def f():
a = ['123']
dbp('a')
然后你可以做
>>> f()
a=
'a'