2013-07-25 65 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) 
相关问题