检查插值字符串是否提供预期的占位符

2 投票
1 回答
1203 浏览
提问于 2025-04-16 10:51

考虑这个虚构的Python函数:

def f(s):
    # accepts a string containing placeholders
    # returns an interpolated string
    return s % {'foo': 'OK', 'bar': 'OK'}

我该如何检查字符串 s 是否包含所有需要的占位符,如果没有的话,让这个函数友好地显示缺少的键呢?

我的解决方案如下。我的问题是:有没有更好的解决方案?

import sys

def f(s):
    d = {}
    notfound = []
    expected = ['foo', 'bar']

    while True:
        try:
            s % d
            break
        except KeyError as e:
            key = e.args[0] # missing key
            notfound.append(key)
            d.update({key: None})

    missing = set(expected).difference(set(notfound))

    if missing:
        sys.exit("missing keys: %s" % ", ".join(list(missing)))

    return s % {'foo': 'OK', 'bar': 'OK'}

1 个回答

3

有一种方法可以查看所有命名的占位符,这个方法叫做 _formatter_parser:

>>>> y="A %{foo} is a %{bar}"

>>>> for a,b,c,d in y._formatter_parser(): print b

foo

bar

如果你想用一种“公开”的方式来做:

>>>> import string
>>>> x = string.Formatter()
>>>> elements = x.parse(y)
>>>> for a,b,c,d in elements: print b

撰写回答