字符串格式的%运算符描述为here。你知道吗
通常,当呈现一个没有转换说明符的字符串时,它会引发TypeError: not all arguments converted during string formatting
。例如,"" % 1
将失败。到目前为止,还不错。你知道吗
有时,如果%运算符右侧的参数是空的,它不会失败:"" % []
,或"" % {}
或"" % ()
将静默地返回空字符串,看起来很公平。你知道吗
用"%s"
代替空字符串也会将空对象转换成字符串,但最后一个会失败,但我认为这是%运算符问题的一个实例,它是通过format
方法解决的。你知道吗
还有一个非空字典的例子,比如"" % {"a": 1}
,它之所以有效是因为它实际上应该与命名类型说明符一起使用,比如"%(a)d" % {"a": 1}
。你知道吗
但是,有一种情况我不明白:"" % b"x"
将返回空字符串,没有引发异常。为什么?你知道吗
我不是百分之百确定,但是在快速查看sources之后,我想原因如下:
当
%
右边只有一个参数时,Python会检查它是否有getitem
方法,如果有,则假定它是一个映射,并希望我们使用像%(name)s
这样的命名格式。否则,Python将从参数创建一个元素元组,并执行位置格式化。参数计数不使用映射检查,因此,由于bytes
和lists
确实有getitem
,它们不会失败:同时考虑:
字符串是此规则的例外-它们有
getitem
,但对于位置格式仍然是“元组化的”:当然,这种“序列作为映射”的逻辑意义不大,因为格式化键总是字符串:
但我怀疑是否有人能解决这个问题,因为
%
无论如何都被抛弃了。你知道吗有问题的行位于unicodeobject.c。它认为所有对象都是“映射”,并且显式地不是元组或字符串,或者它们的子类,都是“字典”,对于那些对象,如果不是所有的参数都被转换,它就不是错误的。你知道吗
^{} 定义为:
也就是说,任何定义了
tp_as_mapping
且具有mp_subscript
的类型都是映射。你知道吗和
bytes
做define that,就像其他任何有__getitem__
的对象一样。因此,至少在python3.4中,__getitem__
的对象不会作为%
格式op的右侧参数失败现在这是对Python2.7的修改。此外,这样做的原因是没有办法检测所有可能用于
%(name)s
格式化的类型,除非接受所有实现__getitem__
的类型,尽管已经排除了最明显的错误。当python3发布时,没有人在那里添加bytes
,尽管它显然不应该支持字符串作为__getitem__
的参数;但是那里也没有list
。你知道吗另一个疏忽是列表不能用于设置位置参数的格式。你知道吗
相关问题 更多 >
编程相关推荐