Python: Poner en mayúscula una palabra usando string.format ()

¿Es posible poner en mayúsculas una palabra usando formato de cadena? Por ejemplo,

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

Debe devolver “Foobar hizo tal y tal”.

Tenga en cuenta que soy muy consciente de .capitalize() ; sin embargo, aquí hay un código (muy simplificado de) que estoy usando:

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

Como puede ver, solo definir al user como x.capitalize() en .format() no funciona, ya que entonces también se aplicaría (incorrectamente) al primer escenario. Y como no puedo predecir el destino, no hay forma de saber qué random.choice se seleccionará de antemano. ¿Que puedo hacer?

Nota adicional: Solo haciendo output = random.choice(['xyz'.format(),'lmn'.format()]) (en otras palabras, formatee cada cadena individualmente, y luego use .capitalize() para el los que lo necesitan) no es una opción viable, ya que printme realidad está eligiendo entre ~ 40 + cadenas.

Puedes crear tu propia subclase de string.Formatter que te permitirá reconocer una conversión personalizada que puedes usar para volver a escribir tus strings.

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

Puede pasar valores adicionales y simplemente no usarlos, como esta opción liviana

 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()) 

La mejor opción probablemente depende de si está haciendo esto lo suficiente como para necesitar su propio Formatter .

Como dijo @ IgnacioVazquez-Abrams, cree una subclase de string.Formatter permite extender / cambiar el formato de la cadena de caracteres.

En tu caso, tienes que sobrecargar el método 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)