x = " \{ Hello \} {0} "
print x.format(42)
Run Code Online (Sandbox Code Playgroud)
给我 : Key Error: Hello\\
我想打印输出: {Hello} 42
我遇到了一个相当简单的问题,我无法想出一个优雅的解决方案.
我正在str.format一个函数中创建一个字符串,该函数在一个dict替换中传递以用于格式.我想创建字符串并使用值格式化它们,如果它们被传递,否则将它们留空.
防爆
kwargs = {"name": "mark"}
"My name is {name} and I'm really {adjective}.".format(**kwargs)
Run Code Online (Sandbox Code Playgroud)
应该回来
"My name is mark and I'm really ."
Run Code Online (Sandbox Code Playgroud)
而不是抛出KeyError(如果我们不做任何事情会发生什么).
令人尴尬的是,我甚至无法为这个问题提出一个不优雅的解决方案.我想我可以通过不使用来解决这个问题str.format,但如果可能的话,我宁愿使用内置(主要是我想要的).
注意:我事先并不知道将使用哪些密钥.如果有人包含一把钥匙但是没有把它放在kwargs dict中,我试图优雅地失败.如果我100%准确地知道将要查找哪些键,我只需填充所有键并完成它.
有没有办法使用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)
这似乎提供了期望的行为.
我希望尝试尽可能简单地保持现有字符串的多元化,并且想知道str.format()在寻找kwargs时是否有可能解释默认值.这是一个例子:
string = "{number_of_sheep} sheep {has} run away"
dict_compiled_somewhere_else = {'number_of_sheep' : 4, 'has' : 'have'}
string.format(**dict_compiled_somewhere_else)
# gives "4 sheep have run away"
other_dict = {'number_of_sheep' : 1}
string.format(**other_dict)
# gives a key error: u'has'
# What I'd like is for format to somehow default to the key, or perhaps have some way of defining the 'default' value for the 'has' key
# I'd have liked: "1 sheep has run away"
Run Code Online (Sandbox Code Playgroud)
干杯
有没有办法用dict格式化字符串,但可选择没有键错误?
这很好用:
opening_line = '%(greetings)s %(name)s !!!'
opening_line % {'greetings': 'hello', 'name': 'john'}
Run Code Online (Sandbox Code Playgroud)
但是,让我说我不知道这个名字,我想格式化上面的行只是为了'greetings'.就像是,
opening_line % {'greetings': 'hello'}
Run Code Online (Sandbox Code Playgroud)
即使以下情况,输出也会很好:
'hii %(name)s !!!' # keeping name un-formatted
Run Code Online (Sandbox Code Playgroud)
但这会KeyError在拆包时给出
有什么办法吗?