4

我对字符串格式中的以下 Python 2.7 和 Python 3.3 行为感到困惑。这是一个关于逗号运算符如何与字符串表示类型交互的挑剔细节问题。

>>> format(10000, ",d")
'10,000'
>>> format(10000, ",")
'10,000'
>>> format(10000, ",s")
ValueError: Cannot specify ',' with 's'.

>>> "{:,}".format(10000)
'10,000'
>>> "{:,s}".format(10000)
ValueError: Cannot specify ',' with 's'.

令我困惑的是为什么,变体有效,没有明确的字符串表示类型。文档说,如果您省略类型,则它是“与 相同” s。然而在这里,它的行为与s.

我认为这只是一个皱纹/角落案例,但这种语法在文档中用作示例:'{:,}'.format(1234567890). 当字符串表示类型被省略时,Python 中是否隐藏了其他“特殊”行为?也许代码真正在做的是检查被格式化的东西的类型而不是“same as s”?

4

2 回答 2

2

在您的示例中,您没有与字符串表示类型进行交互;您正在与int演示类型进行交互。__format__对象可以通过定义方法来提供自己的格式化行为。如 PEP 3101 所述:

The new, global built-in function 'format' simply calls this special
method, similar to how len() and str() simply call their respective
special methods:

    def format(value, format_spec):
        return value.__format__(format_spec)

Several built-in types, including 'str', 'int', 'float', and 'object'
define __format__ methods.  This means that if you derive from any of
those types, your class will know how to format itself.

可以理解,表示类型s不是由对象实现的(请参阅此处int每种对象类型的文档表示类型列表)。异常消息有些误导。没有,问题就更清楚了:,

>>> format(10000, "s")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Unknown format code 's' for object of type 'int'
于 2013-04-01T21:09:44.353 回答
0

请参阅PEP 378 -- 千位分隔符的格式说明符

',' 选项的定义如上所示,用于类型 'd'、'e'、'f'、'g'、'E'、'G'、'%'、'F' 和 ''。为了允许未来的扩展,它对其他类型是未定义的:二进制、八进制、十六进制、字符等

于 2013-03-31T15:28:37.487 回答