我经常发现自己使用以下模式进行字符串格式化。
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() 来表示。然而,当我查看我的代码时,不断重复这些似乎非常不Pythonic.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]}'))
Edit: 为了lfmt
要从不同的命名空间调用时工作,您需要inspect
模块。注意,如文档警告 http://docs.python.org/library/inspect.html#inspect.currentframe, the inspect
模块可能不适合生产代码,因为它可能不适用于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)