2010-08-22 3 views
6

Possible en double:
Unpythonic way of printing variables in Python?interpolation variable en Python

En PHP, on peut écrire:

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

Mais en Python, il est:

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

Existe-t-il un moyen pour moi d'interpoler des variables dans des chaînes à la place? Et sinon, comment cela est-il plus pythonique?

points bonus pour tous ceux qui obtient la référence

Répondre

4

La façon dont vous le faites est maintenant un moyen pythonique de le faire. Vous pouvez également utiliser le dictionnaire locals. Comme si:

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

Maintenant, cela ne semble pas très pythonique, mais il est le seul moyen d'atteindre le même effet que vous avez dans votre mise en forme de PHP. Je m'en tiens à la façon dont tu le fais.

+2

Ouais, vous pouvez * - mais pendant que vous y êtes, que diriez-vous de passer à la "nouvelle" mise en forme de chaîne? '%' -formatation sera supprimée un jour ... – delnan

+0

Cela semble encore pire que la façon dont je le fais – Aillyn

+2

Il est extrêmement mauvais style d'utiliser 'locals()', ne le faites jamais. Passez les valeurs réelles que vous voulez mettre dans la chaîne à la place. – Allen

1

Quelque chose comme cela devrait fonctionner:

"%(fruit)s" % locals() 
11

Le plus proche, vous pouvez obtenir le comportement de PHP est et en maintenant votre Python-zen est:

print "Hey", fruit, "!" 

impression insérera des espaces à chaque virgule.

Le langage Python plus commun est:

print "Hey %s!" % fruit 

Si vous avez des tonnes d'arguments et que vous voulez les nommer, vous pouvez utiliser un dict:

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

Une légère adaptation de l'exemple 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}!') 

pour:

Hey, Pear! 
-1

Ne le faites pas. C'est impopulaire. Par exemple, lorsque vous ajoutez des traductions à votre application, vous ne pouvez plus contrôler quelles variables sont utilisées à moins de vérifier vous-même tous les fichiers de traduction. Par exemple, si vous modifiez une variable locale, vous devrez également la modifier dans toutes les chaînes traduites.