Python 无类型错误的f字符串格式说明符

Python 无类型错误的f字符串格式说明符,python,string-formatting,Python,String Formatting,将普通f字符串与非类型对象一起使用可以: >a=None >>>f'{a}' “没有” 但是,当使用格式说明符时,它会中断---str.format()也是如此: >>f'{a:>6}' 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:不支持的格式字符串传递给了NoneType.\uu格式__ >>>“{:>6}”。格式(a) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:不支持的格式字符串传递给了NoneType.\uu格式__ 出乎意

将普通f字符串与非类型对象一起使用可以:

>a=None
>>>f'{a}'
“没有”
但是,当使用格式说明符时,它会中断---str.format()也是如此:

>>f'{a:>6}'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持的格式字符串传递给了NoneType.\uu格式__
>>>“{:>6}”。格式(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持的格式字符串传递给了NoneType.\uu格式__
出乎意料的是,(至少对我来说)旧的C样式字符串格式可以工作:

>>'%10s'%a
“没有”
这是怎么回事?我不明白为什么
f'{a:>6}'
的计算结果不是
'None'
。为什么格式说明符要破坏它


这是python中的一个bug吗?如果它是一个bug,我将如何修复它?

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

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

None
不支持格式说明符。由每个对象类型决定如何处理格式说明符,以及:

如果传递任何非空字符串,则
对象
本身的
\uuuu格式
方法将引发类型错误

None
继承此默认值

您似乎期望
None
以与字符串相同的方式处理格式说明符,其中
'{:>6}.format('None')='None'
。听起来好像您希望所有类型都像字符串那样处理格式说明符,或者您希望字符串行为是默认的。字符串处理格式说明符的方式特定于字符串;其他类型有自己的处理方式



你可能会想,嘿,
%10s
为什么不也失败呢?首先,
s
请求在进一步处理之前,通过
str
将参数转换为字符串。其次,printf样式字符串格式中的所有转换说明符处理都由
str.\uuuu mod_uuu
执行;它从不委托参数来确定转换说明符的含义。

None
不支持格式说明符。由每个对象类型决定如何处理格式说明符,以及:

如果传递任何非空字符串,则
对象
本身的
\uuuu格式
方法将引发类型错误

None
继承此默认值

您似乎期望
None
以与字符串相同的方式处理格式说明符,其中
'{:>6}.format('None')='None'
。听起来好像您希望所有类型都像字符串那样处理格式说明符,或者您希望字符串行为是默认的。字符串处理格式说明符的方式特定于字符串;其他类型有自己的处理方式



你可能会想,嘿,
%10s
为什么不也失败呢?首先,
s
请求在进一步处理之前,通过
str
将参数转换为字符串。其次,printf样式字符串格式中的所有转换说明符处理都由
str.\uuuu mod_uuu
执行;它从不委托参数来理解转换说明符的含义。

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

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

上述公认的答案解释了原因。我有效使用的解决方案大致如下:

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

我打赌你的答案是‘非类型。_格式_’@JeffCharter你知道python源代码中在哪里定义的吗?我试着搜索,但找不到。不清楚你想问什么。如果你想知道的话,这些都不是bug。@user2357112我不明白为什么这应该是预期的行为
None.\uu repr\uuu()
None.\uu str\uuu()
give
'None'
,所以在我看来,f-string应该能够处理格式说明符。cpython/Objects/object.c:1491我打赌你的答案是“NoneType”。\uu format\uuu'@JeffCharter你知道python源代码中定义了什么吗?我试着搜索,但找不到。不清楚你想问什么。如果你想知道的话,这些都不是bug。@user2357112我不明白为什么这应该是预期的行为
None.\uu repr\uuu()
None.\uu str\uuu()
给出
'None'
,因此在我看来,f字符串应该能够处理格式说明符。cpython/Objects/object.c:1491要同意,
%s
大致等同于
{!s}
,但在一般情况下绝不是
{}
%s
大致相当于
{!s}
,但在一般情况下绝不是
{}
。我有一个很好的解决方法,但只是为了学习,有没有一种方法可以覆盖
非类型。u格式u
?我假设不是,因为
None
是一个单例。@reynoldsnlp:你不能,不是因为
None
是一个单例,而是因为它是用C实现的。(如果您继续查找,您会发现使用
禁果
模块的建议。该模块的实现相当幼稚,不知道如何修复它所破坏的一些更深层的内部结构,如C级插槽和类型属性缓存;如果依赖它,您将得到许多奇怪的segfaults和heisenbug。)我有一个很好的解决方法,但只是为了学习,有没有一种方法可以覆盖
NoneType