2011-01-29 74 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