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)
不幸的是,不,默认情况下没有这样的方法.但是你可以通过覆盖提供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)
| 归档时间: |
|
| 查看次数: |
10529 次 |
| 最近记录: |