将纯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中的错误吗?如果是错误,我该如何解决?
答案 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 ""