Python:使用string.format()大写单词

teh*_*ckz 14 python string-formatting

是否可以使用字符串格式来大写单词?例如,

"{user} did such and such.".format(user="foobar")
Run Code Online (Sandbox Code Playgroud)

应该回归"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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,只是定义userx.capitalize().format()不工作的,因为那么它也将适用(错误地)的第一个场景.由于我无法预测命运,因此无法知道哪些random.choice会提前被选中.我能做什么?

Addt'l note:正好output = random.choice(['xyz'.format(),'lmn'.format()])(换句话说,单独格式化每个字符串,然后.capitalize()用于需要它的那些字符串)不是一个可行的选项,因为printme实际上是从~40 +字符串中选择.

小智 8

如@ 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)
Run Code Online (Sandbox Code Playgroud)

  • 我相信你的例子有一个错误。你应该返回调用 super 的输出,而不是将 `return value` 作为 `convert_field` 的最后一行,即:`return super(ExtendedFormatter, self)...` (2认同)

Joh*_*ooy 7

您可以传递额外的值,而不必使用它们,例如此轻量级选项

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())
Run Code Online (Sandbox Code Playgroud)

最好的选择可能取决于您是否正在这样做以至于需要自己的成熟Formatter

  • 我喜欢这种方法!是的,我正在更大规模地执行此操作(600多个消息,以及各种不同的功能-不只是大写),因此它实际上并不适合我的情况,但仍要记住。 (2认同)

Ign*_*ams 6

您可以创建自己的子类,string.Formatter以便识别可用于重新调整字符串的自定义转换.

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

  • 仅供参考以防其他人有这个问题,[这里是需要更改的功能](http://hg.python.org/cpython/file/2.7/Lib/string.py#l602). (2认同)

Dav*_*rks 6

在 python 3.6+ 中,您现在可以使用 fstrings。https://realpython.com/python-f-strings/

>>> txt = 'aBcD'
>>> f'{txt.upper()}'
'ABCD'
Run Code Online (Sandbox Code Playgroud)