Interpolación de variables en Python

Posible duplicado:
¿Una forma poco python de imprimir variables en Python?

En PHP se puede escribir:

$fruit = 'Pear'; print("Hey, $fruit!"); 

Pero en Python es:

 fruit = 'Pear' print("Hey, {0}!".format(fruit)) 

¿Hay alguna manera de interpolar variables en cadenas? Y si no, ¿cómo es esto más pythonico?

Puntos de bonificación para quien obtenga la referencia.

La forma en que lo haces ahora es una forma pythonica de hacerlo. También puede utilizar el diccionario locals . Al igual que:

 >>> fruit = 'Pear' >>> print("Hey, {fruit}".format(**locals())) Hey, Pear 

Ahora eso no parece muy python, pero es la única forma de lograr el mismo efecto que tiene en su formato PHP. Me limitaré a seguir la forma en que lo haces.

Lo más cercano que puedes llegar al comportamiento de PHP es y aún así mantener tu Python-zen es:

 print "Hey", fruit, "!" 

La impresión insertará espacios en cada coma.

El idioma Python más común es:

 print "Hey %s!" % fruit 

Si tienes muchos argumentos y quieres nombrarlos, puedes usar un dict:

 print "Hey %(crowd)s! Would you like some %(fruit)s?" % { 'crowd': 'World', 'fruit': 'Pear' } 

Una ligera adaptación del ejemplo de NamespaceFormatter en PEP-3101 :

 import string class NamespaceFormatter(string.Formatter): def __init__(self, namespace={}): super(NamespaceFormatter, self).__init__() self.namespace = namespace def get_value(self, key, args, kwds): if isinstance(key, str): try: # Check explicitly passed arguments first return kwds[key] except KeyError: return self.namespace[key] else: super(NamespaceFormatter, self).get_value(key, args, kwds) fmt = NamespaceFormatter(globals()) fruit = 'Pear' print fmt.format('Hey, {fruit}!') 

para:

 Hey, Pear! 

Algo como esto debería funcionar:

 "%(fruit)s" % locals() 

No lo hagas Es antipónico. Como ejemplo, cuando agrega traducciones a su aplicación, ya no puede controlar qué variables se usan a menos que usted mismo revise todos los archivos de traducción.

Como ejemplo, si cambia una variable local, también deberá cambiarla en todas las cadenas traducidas.