2011-01-29 39 views
2

考虑这个虚构的Python函数:检查插值字符串提供预期的占位符

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

我如何检查字符串小号提供所有预期的占位符,如果没有,使功能礼貌地显示缺少的钥匙?

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

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

您应该使用str.format新码。 – 2011-01-29 20:12:44

+0

谢谢你的提示,我一定会这样做的。虽然阅读字符串模块文档,我意识到,在我的例子中,我只需要简单的替代值,而不是转换或格式化它们,所以旧的(但不弃用)string.Template将是一个更好的选择。 – Paolo 2011-01-29 22:11:08

回答

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