Python 无类型错误的f字符串格式说明符
将普通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格式__ 出乎意
>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