2014-09-12 59 views
0

這工作:未知格式代碼 'R' 爲 'BOOL' 類型的對象

In [3]: print "%r"%(1==2) 
False 

這類作品:

In [2]: formatted_str = "{0:1.2f}".format(1==2) 

In [3]: formatted_str 
Out[3]: '0.00' 

但是:

In [5]: formatted_str = "{0:r}".format(1==2) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-5-b136410cc311> in <module>() 
----> 1 formatted_str = "{0:r}".format(1==2) 

ValueError: Unknown format code 'r' for object of type 'bool' 

你如何讓.format()爲bool打印「True」或「False」?

回答

4

嗯,首先:

如何讓.format()爲bool打印「True」或「False」?

只是不指定任何東西。 bool值的默認格式已經爲您提供'True''False'。而同樣如此% -formatting:

>>> '{0}'.format(False) 
'False' 
>>> '%s' % (False,) 
'False' 

__format____str__,並__repr__bool都返回同樣的事情 - 在2.X的__unicode__返回同樣的事情,一個Unicode版本也是如此,課程。這也意味着:

>>> format(False), format(False, ''), repr(False), str(False), unicode(False) 
('False', 'False', 'False', 'False', u'False') 

但更普遍的,如果你沒有需要%r,你會怎麼做,與format

那麼,有沒有這樣的格式規範代碼r(在:後到來的東西),但有一個轉換修改標誌r(事情的!分離後,和之前的:,如果存在)。所以:

'{0!r}'.format(1==2) 

Format String Syntax該文檔更詳細地解釋:

轉換字段格式化之前引起類型強制。通常,格式化值的工作是通過值本身的__format__()方法完成的。但是,在某些情況下,希望強制將某個類型格式化爲字符串,並覆蓋自己的格式定義。通過在調用__format__()之前將該值轉換爲字符串,正常的格式化邏輯被繞過。目前

三個轉換標誌的支持:'!s'它呼籲值str()'!r'這就要求repr()'!a'這就要求ascii()

注意,這也意味着,基本'{0}'.format(1==2)實際上並沒有做同樣的事情'%s' % (1=2,),因爲它調用__format__而非__str__

更普遍,而多爲% -formatting格式規範代碼匹配格式轉換類型代碼,它不是完全匹配。除了拆分「轉換型」的概念分爲兩​​個獨立的東西,也有那些微妙或根本代碼不同的事情,最明顯的是,'%%'的意思是「這不是一個格式代碼,這是一個文字%」,而':%'手段「以百分比打印這個「。當它不明顯時,文檔總是很清楚。

+1

這是一個很好的答案。我喜歡你如何突出顯示轉換修飾符標誌並解釋說'!'是一個_separator_。我覺得你在閱讀這個答案之前已經比我能夠更好地理解我對格式迷你語言的理解。從我+1。 – mgilson 2014-09-12 18:11:59

+0

@mgilson:我對所有這些作品都有正確的條款嗎?我沒有問題,記住如何使用它們,但記住什麼叫他們是另一回事... – abarnert 2014-09-12 18:14:11

+0

不知道:) - 他們甚至可能沒有名字(前現在)。我用的是「轉換修正標誌」如此罕見,我需要我想要它...... – mgilson 2014-09-12 18:16:54

2

像這樣(python2.7 +):

>>> '{!r}'.format(1 == 2) 
'False' 

或者,如果你想指定的位置(或者被迫與python2.6的兼容):

>>> '{1!r} is not {0!r}'.format(1==2, 1==1) 
'True is not False' 

你甚至可以使用關鍵字正常:

>>> '{foo!r} is not {0!r}'.format(1==2, foo=1==1) 
'True is not False'