其他分享
首页 > 其他分享> > 捕获字符串格式的** vars()模式

捕获字符串格式的** 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