捕获字符串格式的** vars()模式
作者:互联网
我经常发现自己使用以下模式进行字符串格式化.
a = 3
b = 'foo'
c = dict(mykey='myval')
#prints a is 3, b is foo, mykey is myval
print('a is {a}, b is {b}, mykey is {c[mykey]}'.format(**vars()))
也就是说,我经常需要在本地名称空间中打印所需的值,这些值由对vars()的调用表示.但是,当我查看代码时,不断重复使用.format(** vars())模式似乎很不明智.
我想创建一个将捕获此模式的函数.就像下面这样.
# doesn't work
def lfmt(s):
"""
lfmt (local format) will format the string using variables
in the caller's local namespace.
"""
return s.format(**vars())
除了在我进入lfmt命名空间时,vars()不再是我想要的.
我如何编写lfmt以便它在调用者的名称空间中执行vars(),使得以下代码可以如上例所示工作?
print(lfmt('a is {a}, b is {b}, mykey is {c[mykey]}'))
解决方法:
编辑:为了使lfmt从不同的命名空间调用时可以工作,您将需要inspect模块.请注意,作为the documentation warns,检查模块可能不适用于生产代码,因为它可能不适用于所有Python实现
import inspect
def lfmt(s):
caller = inspect.currentframe().f_back
return s.format(**caller.f_locals)
a = 3
b = 'foo'
c = dict(mykey='myval')
print(lfmt('a is {a}, b is {b}, mykey is {c[mykey]}'))
# a is 3, b is foo, mykey is myval
标签:scope,string-formatting,python 来源: https://codeday.me/bug/20191210/2100655.html