如果我用Python编写:
data = {'n': 3, 'k': 3.141594, 'p': {'a': 7, 'b': 8}}
print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data))
del data['k']
data['p']['b'] = None
print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data))
我得到:
3, 3.14, 7, 8
Traceback (most recent call last):
File "./funky.py", line 186, in <module>
print('{n}, {k:.2f}, {p[a]}, {p[b]}'.format(**data))
KeyError: 'k'
如何让Python更优雅地格式化None's和non existent字段,而不是错误消息?
举个例子,我想在输出中看到更像:
3, 3.14, 7, 8
3, ~, 7, ~
当然,理想情况下,我希望能够指定使用的字符串,而不是那些缺少的值。
PEP 3101中的建议是将Formatter子类化:
按照设置,如果找不到字段或属性,则它将打印
~~
;如果给定字段值,则使用无效格式,则它将打印!!
。(如果希望引发值错误的默认值,只需使用None
作为关键字参数bad_fmt
。)要处理丢失的键,您需要对
get_field
进行子类化,以捕获KeyError
或AttributeError
和format_field
来返回丢失键的默认值。由于您捕获的是
format_field
错误,因此也可以通过捕获超类中的ValueError
来捕获错误的格式字段。如果您能够单独进行格式化,那么可以使用
Template.safe_substitute
来优雅地处理丢失的值:str.format()
方法没有为您提供处理丢失的键或替换值的直接方法。您可以添加一个间接层;传入一个处理缺失值和
None
值的映射,并更改格式以仅使用该参数:现在所有的槽都引用位置参数
0
,它被当作字典对待,但是键查找总是成功的,丢失的值和None
都被占位符值替换。这里
PlaceholderFormatValue()
确保无论格式规范给出什么,值都可以插入到格式中。例如,这使得{0[k]:.2f}
工作。通过包装任何
dict
值并具有PlaceholderFormatValue
句柄项访问,上述方法还可以处理未能提供嵌套键或整个字典的情况:相关问题 更多 >
编程相关推荐