当前位置: 首页 > 面试题库 >

如何使Python正常格式化无和不存在的字段

宇文峰
2023-03-14
问题内容

如果我用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和不存在的字段?

举个例子,我想在输出中看到更多类似的东西:

3, 3.14, 7, 8
3, ~, 7, ~

当然,理想情况下,我希望能够指定所使用的字符串而不是那些缺少的值。


问题答案:

PEP
3101中
的建议是将Formatter子类化:

import string
class PartialFormatter(string.Formatter):
    def __init__(self, missing='~~', bad_fmt='!!'):
        self.missing, self.bad_fmt=missing, bad_fmt

    def get_field(self, field_name, args, kwargs):
        # Handle a key not found
        try:
            val=super(PartialFormatter, self).get_field(field_name, args, kwargs)
            # Python 3, 'super().get_field(field_name, args, kwargs)' works
        except (KeyError, AttributeError):
            val=None,field_name 
        return val

    def format_field(self, value, spec):
        # handle an invalid format
        if value==None: return self.missing
        try:
            return super(PartialFormatter, self).format_field(value, spec)
        except ValueError:
            if self.bad_fmt is not None: return self.bad_fmt   
            else: raise

fmt=PartialFormatter()
data = {'n': 3, 'k': 3.141594, 'p': {'a': '7', 'b': 8}}
print(fmt.format('{n}, {k:.2f}, {p[a]}, {p[b]}', **data))
# 3, 3.14, 7, 8
del data['k']
data['p']['b'] = None
print(fmt.format('{n}, {k:.2f}, {p[a]:.2f}, {p[b]}', **data))
# 3, ~~, !!, ~~

按照设置,~~如果找不到字段或属性,并且!!给定字段值使用了无效格式,它将打印。(如果您要引发默认值错误,请仅使用None关键字参数bad_fmt。)

为了处理丢失的钥匙,你需要子类都get_field赶上KeyErrorAttributeErrorformat_field为失踪键返回默认值。

由于您正在捕获format_field错误,因此可以通过捕获ValueError超类中的来捕获格式错误的字段。



 类似资料:
  • 问题内容: 我有一些格式不一致的现有代码-有时两个空格用于缩进,有时四个空格,以此类推。代码本身是正确的,并且经过了严格的测试,但是格式却很糟糕。 在线上是否有一个地方,我可以简单地粘贴一段Python代码并自动为我缩进/设置格式?或者,是否可以执行类似的操作,并用格式化的版本覆盖每个文件? 问题答案: 编辑:如今,我建议使用autopep8,因为它不仅可以纠正缩进问题,而且(根据您的判断)可以使

  • 问题内容: 我非常喜欢使用字典来格式化字符串。它可以帮助我阅读所使用的字符串格式,也可以利用现有的字典。例如: 但是我不能弄清楚这样做的python 3.x语法(或者甚至是可能的)。我想做以下 问题答案: 由于问题是特定于Python 3的,因此这里使用的是从Python 3.6开始可用的新f字符串语法: 注意外部单引号和内部双引号(您也可以采用其他方法)。

  • 从我在网上找到的许多例子、文档和Stack overflow中找到的例子来看,在slf4j中连接字符串的正确方法是使用内置的字符串格式。 例如: 我也尝试了不设置格式,结果也是一样的: 出于某种原因,这对我不起作用,我不知道我错过了什么。如果我们传递一个对象,是否使用不同的格式? 而不是使用常规级联时得到的预期消息: 或者手动调用.toString() 根据声纳的说法,这最后一个选项是不正确的,因

  • 问题内容: 如果我用javadoc 编写,它不会出现,因为标签在格式化文本方面具有特殊功能。 如何在Javadoc中显示此字符? 问题答案: 您可以使用为 < 和为 > 。

  • 我有多个文本框,当用户在不同的文本框中键入时,我希望有一个存储所有格式化数据的数组。 格式化的数据以 m:ss 为单位(m - 分钟,s - 秒) 现在,所有不同的文本框都显示相同的值,因为只有一个this.formatTime. 我们如何改变这一点,以便v-model遍历数组,并将其添加到格式化值数组中? 文本框应显示格式化的值,并将其存储在所有格式值[]中。 我真的被困在这个,谢谢你的时间!

  • 问题内容: 我有以下格式化字符串的方法: 如果是负的零(,等)的输出将是。 如何使输出始终始终为负的零值和正的零值? (实现此目标相当简单,但我找不到所谓的简洁pythonic方式。理想情况下,有一个我不知道的字符串格式设置选项。) 问题答案: 加零: 您可以格式化: