使用十六进制,八进制或二进制整数作为Python的str.format()方法的参数索引时的KeyError

前端之家收集整理的这篇文章主要介绍了使用十六进制,八进制或二进制整数作为Python的str.format()方法的参数索引时的KeyError前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

简单使用Pythonstr.format()方法

>>> '{0}'.format('zero')
'zero'

十六进制,八进制和二进制文字不起作用:

>>> '{0x0}'.format('zero')
KeyError: '0x0'
>>> '{0o0}'.format('zero')
KeyError: '0o0'
>>> '{0b0}'.format('zero')
KeyError: '0b0'

但是,根据replacement field grammar,他们应该:

06002

integer grammar如下:

06003

我是否误解了文档,或者Python的行为不像宣传的那样? (我使用的是Python 2.7.)

最佳答案
这看起来像语法中的错误.文本没有什么可澄清的;它只是将其描述为“一个数字或一个标识符”,并讨论如何解释一个数字.

测试它,该字段显然不被视为整数:

>>> '{08}'.format(*range(10)) # should be SyntaxError
'8'
>>> '{010}'.format(*range(10)) # should be '8'
'10'
>>> '{-1}'.format(*range(10)) # should be '9',but looked up as a string
KeyError: '-1'
>>> '{1 }'.format(*range(10)) # should be '1',but looked up as a string
KeyError: '1 '
>>> '{10000000000000000000}'.format(1) # should be IndexError
ValueError: Too many decimal digits in format string

查看代码,它不会从Python解析器借用来解析格式字符串;它使用自定义解析,并且将arg_spec解释为数字的代码使用get_integer函数,该函数仅转换每个数字并移位和添加,直到字段结束或我们得到PY_SSIZE_T_MAX的数字.

PEP 3101表明这是故意的:

Simple field names are either names or numbers. If numbers,they must be valid base-10 integers …

它没有具体说它不能太接近最大指数值,也不能说不能使用负指数.但是大多数其他怪癖可以通过使用“有效的基数10整数”描述而不仅仅是“整数”来解释.事实上,只是将其描述为数字而不是整数将解决所有的怪癖.

element_index的解析方式与arg_name完全相同. #8985故意说element_index“…对整数索引使用最窄的可能定义,以便将所有其他字符串传递给映射.”对于arg_name是否也是故意的,或者是否是使用相同代码的意外后果,我不确定.

文档在3.4中保持不变,并且代码current trunk中实际上没有变化.

我建议搜索bug trackerpython-dev档案,看看之前是否已经提出过.如果没有,请确定您是否认为应该更改文档或代码,提交错误,并理想地提交补丁.

猜你在找的Python相关文章