f字符串格式说明符(无)抛出TypeError

时间:2018-10-10 02:17:25

标签: python string-formatting

将纯f字符串与NoneType对象一起使用会起作用:

>>> a = None
>>> f'{a}'
'None'

但是,当使用格式说明符时,它会中断--- str.format()也是如此:

>>> f'{a:>6}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to NoneType.__format__

>>> '{:>6}'.format(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to NoneType.__format__

出乎意料的是,(至少对我而言)旧的C样式字符串格式有效:

>>> '%10s' % a
'      None'

这是怎么回事?我不明白为什么f'{a:>6}'不能评估为' None'。格式说明符为什么要破坏它?

这是python中的错误吗?如果是错误,我该如何解决?

3 个答案:

答案 0 :(得分:4)

None不支持格式说明符。由每个对象类型决定如何处理格式说明符,以及the default is to reject them

  

如果__format__的{​​{1}}方法本身传递了任何非空字符串,则会引发TypeError。

object继承了此默认设置。

您似乎期望None以与字符串相同的方式处理格式说明符,其中None。听起来,您希望所有类型都像字符串一样处理格式说明符,或者您希望字符串行为是默认行为。字符串处理格式说明符的方式特定于字符串。其他类型都有自己的处理方式。


您可能会想,嘿,'{:>6}'.format('None') == ' None'为什么也不会失败?首先,%10s请求s将参数转换为字符串,然后再进行进一步处理。其次,所有转换说明符在printf样式的字符串格式中的处理均由str执行;它从不委托参数来确定转换说明符的含义。

答案 1 :(得分:3)

None不是字符串,因此f'{None:>6}'毫无意义。您可以使用f'{None!s:>6}'将其转换为字符串。 !a!s!r分别在对象上调用ascii()str()repr()

答案 2 :(得分:0)

上面接受的答案解释了原因。我有效使用的解决方案大致如下:

f"{mystring:.2f}" if mystring is not None else ""