2013-07-25 66 views
7

是否可以使用字符串格式化字大寫?例如,Python:使用string.format()大寫一個單詞

"{user} did such and such.".format(user="foobar") 

應該返回「Foobar做了這​​樣那樣的事情。」

請注意,我很清楚.capitalize();但是,這裏有一個(非常簡化的版本)代碼,我使用的是:

printme = random.choice(["On {date}, {user} did la-dee-dah. ", 
         "{user} did la-dee-dah on {date}. " 
         ]) 

output = printme.format(user=x,date=y) 

正如你所看到的,只是定義userx.capitalize().format()不起作用,因爲那也將被(錯誤地應用)到第一種情況。而且由於我無法預測命運,因此無法預先知道哪個random.choice會被選中。我能做什麼?

Addt'l注:只是做output = random.choice(['xyz'.format(),'lmn'.format()])(換句話說,單獨格式化每個字符串,然後使用.capitalize()爲需要它的那些)是不是一個可行的選擇,因爲printme實際上是從選擇40〜 +字符串。

+0

你爲什麼隨意recasing用戶名? –

+0

@ IgnacioVazquez-Abrams用戶名實際上等於用戶名**或**代詞 - 對於代詞而言,人們並不總是將它們大寫。 – tehsockz

+0

等等...你會改變用戶名的顯示大小寫,但不是代詞?爲什麼要這麼做?人們期望他們的用戶名正好是他們輸入框中的情況。 – user2357112

回答

5

您可以創建自己的string.Formatter的子類別,這將允許您識別自定義conversion,您可以使用它來恢復您的字符串。

myformatter.format('{user!u} did la-dee-dah on {date}, and {pronoun!l} liked it. ', 
         user=x, date=y, pronoun=z) 
+2

僅供參考,如果其他人有這個問題,[這裏是需要改變的功能](http://hg.python.org/cpython/file/2.7/Lib/string.py#l602)。 – tehsockz

+1

s/changed/overridden/ –

4

你可以通過額外的價值,只是不使用它們,這樣輕巧的選項

printme = random.choice(["On {date}, {user} did la-dee-dah. ", 
         "{User} did la-dee-dah on {date}. " 
         ]) 

output = printme.format(user=x, date=y, User=x.capitalize()) 

最好的選擇可能取決於你是否在做這足以需要自己的茂盛的Formatter

+2

我喜歡這種方法!是的,我正在做一個更大的規模(600多條信息,以及各種不同的功能 - 不僅僅是大寫),所以它不是真的適用於我說的情況,但仍然需要記住。 – tehsockz

0

正如@ IgnacioVazquez-Abrams所說,創建一個string.Formatter的子類允許您擴展/更改格式字符串處理。

你的情況,你必須重載方法convert_field

from string import Formatter 
class ExtendedFormatter(Formatter): 
    """An extended format string formatter 

    Formatter with extended conversion symbol 
    """ 
    def convert_field(self, value, conversion): 
     """ Extend conversion symbol 
     Following additional symbol has been added 
     * l: convert to string and low case 
     * u: convert to string and up case 

     default are: 
     * s: convert with str() 
     * r: convert with repr() 
     * a: convert with ascii() 
     """ 

     if conversion == "u": 
      return str(value).upper() 
     elif conversion == "l": 
      return str(value).lower() 
     # Do the default conversion or raise error if no matching conversion found 
     super(ExtendedFormatter, self).convert_field(value, conversion) 

     # return for None case 
     return value 


# Test this code 

myformatter = ExtendedFormatter() 

template_str = "normal:{test}, upcase:{test!u}, lowcase:{test!l}" 


output = myformatter.format(template_str, test="DiDaDoDu") 
print(output) 
相關問題