<p><code>str.format()</code>方法没有为您提供处理丢失的键或替换值的直接方法。</p>
<p>您可以添加一个间接层;传入一个处理缺失值和<code>None</code>值的映射,并更改格式以仅使用该参数:</p>
<pre><code>class PlaceholderFormatValue():
def __format__(self, spec):
return '~'
def __getitem__(self, name):
# handle further nested item access
return self
class formatting_dict(dict):
def __getitem__(self, name):
value = self.get(name)
if isinstance(value, dict):
# rewrap nested dictionaries to handle missing nested keys
value = type(self)(value)
return value if value is not None else PlaceholderFormatValue()
print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data)))
</code></pre>
<p>现在所有的槽都引用位置参数<code>0</code>,它被当作字典对待,但是键查找总是成功的,丢失的值和<code>None</code>都被占位符值替换。</p>
<p>这里<code>PlaceholderFormatValue()</code>确保无论格式规范给出什么,值都可以插入到格式中。例如,这使得<code>{0[k]:.2f}</code>工作。</p>
<p>通过包装任何<code>dict</code>值并具有<code>PlaceholderFormatValue</code>句柄项访问,上述方法还可以处理未能提供嵌套键或整个字典的情况:</p>
<pre><code>>>> data = {'n': 3, 'k': 3.141594, 'p': {'a': 7, 'b': 8}}
>>> del data['k']
>>> data['p']['b'] = None
>>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data)))
3, ~, 7, ~
>>> del data['p']['a']
>>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data)))
3, ~, ~, ~
>>> del data['p']
>>> print('{0[n]}, {0[k]:.2f}, {0[p][a]}, {0[p][b]}'.format(formatting_dict(data)))
3, ~, ~, ~
</code></pre>