检查要插入的字符串是否提供了预期的占位符

发布于 2024-10-15 07:21:49 字数 773 浏览 2 评论 0原文

考虑这个虚构的 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'}

Consider this fictitious Python function:

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

How can I check that the string s provides all the expected placeholders, and if not, make the function politely show the missing keys?

My solution follows. My question: is there a better solution?

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'}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吝吻 2024-10-22 07:21:49

有一种方法可以使用 _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

There's a way to see all of the named placeholders using the _formatter_parser method:

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

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

foo

bar

For a "public" way:

>>>> import string
>>>> x = string.Formatter()
>>>> elements = x.parse(y)
>>>> for a,b,c,d in elements: print b
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文