Formato de cadena dinámicamente

Si quiero que mi cadena formateada sea ajustable dinámicamente, cambiaré el siguiente código de

print '%20s : %20s' % ("Python", "Very Good") 

a

 width = 20 print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good") 

Sin embargo, parece que la concatenación de cadenas es incómoda aquí. ¿Alguna otra forma de simplificarlo?

Puede obtener el valor de relleno de la lista de argumentos:

 print '%*s : %*s' % (20, "Python", 20, "Very Good") 

Incluso puede insertar los valores de relleno dinámicamente:

 width = 20 args = ("Python", "Very Good") padded_args = zip([width] * len(args), args) # Flatten the padded argument list. print "%*s : %*s" % tuple([item for list in padded_args for item in list]) 

Puedes hacerlo usando el método str.format() .

 >>> width = 20 >>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width)) Python : Very Good 

A partir de Python 3.6 puedes usar f-string para hacer esto:

 In [579]: lang = 'Python' In [580]: adj = 'Very Good' In [581]: width = 20 In [582]: f'{lang:>{width}}: {adj:>{width}}' Out[582]: ' Python: Very Good' 
 print '%*s : %*s' % (width, 'Python', width, 'Very Good') 

Si no desea especificar los anchos al mismo tiempo, puede preparar una cadena de formato con anticipación, como lo estaba haciendo, pero con otra sustitución. Usamos %% para escapar de los signos de% reales en una cadena. Queremos terminar con %20s en nuestra cadena de formato cuando el ancho es 20, así que usamos %%%ds y suministramos la variable de ancho para sustituir allí. Los dos primeros signos% se convierten en un% literal, y luego% d se sustituye por la variable.

Así:

 format_template = '%%%ds : %%%ds' # later: width = 20 formatter = format_template % (width, width) # even later: print formatter % ('Python', 'Very Good')