您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:20:38 python 字数 4230 阅读 491 来源 www.jb51.cc/python

简单使用Python的str.format()方法:>>> '{0}'.format('zero') 'zero' 十六进制,八进制和二进制文字不起作用:>>> '{0x0}'.format('zero') KeyError: '0x0' >>> '{0o0}'.format('zero') KeyErr

概述

简单使用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的str.format()方法的参数索引时的KeyError全部内容,希望文章能够帮你解决使用十六进制,八进制或二进制整数作为Python的str.format()方法的参数索引时的KeyError所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶