python, cadena de formato

Estoy tratando de construir una cadena de formato con un argumento perezoso, por ejemplo, necesito algo como:

"%s \%s %s" % ('foo', 'bar') # "foo %s bar" 

¿Cómo puedo hacer esto?

 "%s %%s %s" % ('foo', 'bar') 

necesitas %%

con python 2.6:

 >>> '{0} %s {1}'.format('foo', 'bar') 'foo %s bar' 

o con python 2.7:

 >>> '{} %s {}'.format('foo', 'bar') 'foo %s bar' 
 >>> "%s %%s %s" % ('foo', 'bar') 'foo %s bar' 
 "%s %%s %s" % ('foo', 'bar') # easy! 

Doble% de caracteres le permite poner% ‘s en cadenas de formato.

%% escapa del símbolo % . Así que básicamente solo tienes que escribir:

 "%s %%s %s" % ('foo', 'bar') # "foo %s bar" 

Y si alguna vez necesitas generar un porcentaje o algo:

 >>> "%s %s %%%s" % ('foo', 'bar', '10') 'foo bar %10' 

Solo usa un segundo símbolo de porcentaje.

 In [17]: '%s %%s %s' % ('foo', 'bar') Out[17]: 'foo %s bar' 

Python 3.6 ahora admite la interpolación de cadenas literales abreviadas con PEP 498. Para su caso de uso, la nueva syntax permite:

 var1 = 'foo' var2 = 'bar' print(f"{var1} %s {var2}") 

Si no conoce el orden en que se suministrarán los argumentos, puede usar plantillas de cadena

Aquí hay una clase independiente que se presenta como una str con esta funcionalidad (solo para argumentos de palabras clave)

 class StringTemplate(str): def __init__(self, template): self.templatestr = template def format(self, *args, **kws): from string import Template #check replaced strings are in template, remove if undesired for k in kws: if not "{"+k+"}" in self: raise Exception("Substituted expression '{k}' is not on template string '{s}'".format(k=k, s=self)) template= Template(self.replace("{", "${")) #string.Template needs variables delimited differently than str.format replaced_template= template.safe_substitute(*args, **kws) replaced_template_str= replaced_template.replace("${", "{") return StringTemplate( replaced_template_str )