捕获字符串格式中的**vars()模式

2024-10-03 21:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常发现自己使用以下模式进行字符串格式化。在

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())模式似乎非常不和谐。在

我想创建一个函数来捕捉这个模式。应该是如下所示。在

^{pr2}$

除了当我在lfmt名称空间时,vars()已经不是我想要的了。在

如何编写lfmt以便它在调用方的名称空间中执行vars(),以便下面的代码可以像上面的示例一样工作?在

print(lfmt('a is {a}, b is {b}, mykey is {c[mykey]}'))

Tags: 字符串代码名称formatfoois模式空间
3条回答

你必须检查调用帧中的变量。在

这将帮助您开始:

import inspect
import pprint

def lfmt(s):
    for frame in inspect.getouterframes(inspect.currentframe()):
        f = frame[0]
        print pprint.pformat(f.f_locals)
    return '???'

if __name__ == '__main__':
    a = 10
    b = 20
    c = 30
    lfmt('test')

编辑:为了使lfmt在从不同名称空间调用时工作,您需要inspect模块。注意,作为the documentation warnsinspect模块可能不适合生产代码,因为它可能无法与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

给你:

import sys

def lfmt(s):
    """
    lfmt (local format) will format the string using variables
    in the caller's local namespace.
    """

    if hasattr(sys, "tracebacklimit") and sys.tracebacklimit == 0:
        raise Exception, "failfailfail"

    try:
        raise ZeroDivisionError
    except ZeroDivisionError:
        f = sys.exc_info()[2].tb_frame.f_back

    return s.format(**f.f_locals)

a = 5
somestring = "text"
print lfmt("{a} {somestring}")

它起作用并不意味着你应该使用它。这就是开发人员所说的“主要黑客”,通常附带一条评论“XXX fix me XXX”。在

相关问题 更多 >