使用Python中的嵌套函数进行范围设定

时间:2017-07-08 00:58:07

标签: python scope

这个问题与此处提出的其他问题相似,但在阅读完答案之后,我并没有理解它,并希望得到进一步的指导。

在草拟新代码时,我发现自己添加了许多语句,如:

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()范围内的任何内容,但显然它没有。有人可以解释原因吗?

此外,还可以了解更好的打印变量名称后跟其格式化内容的方法。

2 个答案:

答案 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'