2013-07-02 26 views
0

PEP 3101指定高级字符串格式化。除其他外,它定义了格式字符串的新语法规范(例如,{:.2f})以及自定义类型如何控制自己的格式。这是通过执行:Python PEP3101:为什么field_spec没有传递给__format__函数?

def __format__(value, format_spec): 
    # Your code here 

字符串格式代码可以包括一个转换标志。例如:"{0!r:20}".format("Hello"),其中!r表示convert the the value to a string using repr()。但是,__format__仅获取冒号:(即format_spec)后的值。我想知道原因(即设计决定,而不是代码)为什么?我认为提供!之后的所有内容都会更加灵活。

回答

1

冒号前面的部分仅用于字符串格式化,并且是一个模板函数,而不是关于格式化实际值本身。

的部分后结肠分开处理,并且也可以使用format() function指定:

>>> format(234, '02x') 
'ea' 

格式化为最小的2个字符的套管下零填充的十六进制数。 .__format__()可以让你连接到这个功能;这是格式化价值的业务结束。

冒号前的部分指定field_name,字符串格式化程序如何检索要格式化的值。在格式化该值时,根本不应该如何确定该字段。 field_name仅用于查找要调用.__format__()的值,并指定该值的备用转换方法(!r!s)。

注意,通过使用!r.__format__()方法忽略.__repr__()来代替!这同样适用于!s.__str__()

>>> class Foo(object): 
...  def __repr__(self): return '<Foo repr>' 
...  def __str__(self): return 'Foo as string' 
...  def __format__(self, spec): return 'Formatting Foo as {}'.format(spec) 
... 
>>> '{:02x}'.format(Foo()) 
'Formatting Foo as 02x' 
>>> '{!s}'.format(Foo()) 
'Foo as string' 
>>> '{!r}'.format(Foo()) 
'<Foo repr>' 
+0

不过是种浪费,因为你可以定义是否被用于两个部分'__format__'在一个更清洁的方式代表你的数据的其他方式。现在你需要把所有东西都放在规范中。谢谢你的帮助。 – Hernan

+0

你会在':'之前的部分做什么?您将知道关键字参数的名称,或者位置参数的索引,以及可能使用的属性访问。这与格式无关! –

+0

在':'之前,你唯一拥有的是域名和转换开关(所以'!r'或'!s');如果指定了后者,会导致**。**格式__()'方法**被忽略**,所以没有必要将'___格式__()'方法传递给该方法。 –

相关问题