python字符串格式suppress/silent keyerror/indexerror

Cod*_*eak 16 python string format

有没有办法使用python string.format,这样当索引丢失时不会抛出异常,而是插入一个空字符串.

result = "i am an {error} example string {error2}".format(hello=2,error2="success")
Run Code Online (Sandbox Code Playgroud)

在这里,结果应该是:

"i am an   example string success"
Run Code Online (Sandbox Code Playgroud)

现在,python抛出了一个keyerror并停止格式化.是否有可能改变这种行为?

谢谢

编辑:

存在Template.safe_substitute(即使使模式保持原样而不是插入空字符串),但对于string.format可能没有类似的东西

期望的行为类似于php中的字符串替换.

class Formatter(string.Formatter):
  def get_value(self,key,args,kwargs):
    try:
        if hasattr(key,"__mod__"):
            return args[key]
        else:
            return kwargs[key]
    except:
        return ""
Run Code Online (Sandbox Code Playgroud)

这似乎提供了期望的行为.

Fab*_*olm 18

str.format()不期望一个映射对象.试试这个:

from collections import defaultdict

d = defaultdict(str)
d['error2'] = "success"
s = "i am an {0[error]} example string {0[error2]}"
print s.format(d)
Run Code Online (Sandbox Code Playgroud)

您使用str()返回"" 的工厂制作defaultdict .然后为defaultdict创建一个键.在格式字符串中,您可以访问传递的第一个对象的键.这样做的好处是允许你传递其他键和值,只要你的defaultdict是第一个参数format().

另请参阅http://bugs.python.org/issue6081


CoD*_*anX 13

格式映射中字符串的官方解决方案(Python 3 Docs)是对类进行子dict类化并定义魔术方法__missing__().只要缺少某个键,就会调用此方法,而它返回的内容则用于字符串格式:

class format_dict(dict):
    def __missing__(self, key):
        return "..."

d = format_dict({"foo": "name"})

print("My %(foo)s is %(bar)s" % d) # "My name is ..."

print("My {foo} is {bar}".format(**d)) # "My name is ..."
Run Code Online (Sandbox Code Playgroud)


Dan*_*uev 5

不幸的是,不,默认情况下没有这样的方法.但是你可以通过覆盖提供defaultdict或object __getattr__,并使用如下:

class SafeFormat(object):
    def __init__(self, **kw):
        self.__dict = kw

    def __getattr__(self, name):
        if not name.startswith('__'):
            return self.__dict.get(name, '')

print "i am an {0.error} example string {0.error2}".format(SafeFormat(hello=2,error2="success"))
i am an  example string success
Run Code Online (Sandbox Code Playgroud)