2009-08-20 6 views
19

Vu:interpolation de chaîne Python en utilisant le dictionnaire et les chaînes

dict = {"path": "/var/blah"} 
curr = "1.1" 
prev = "1.0" 

Quel est le meilleur/chemin le plus court pour interpoler la chaîne pour générer les éléments suivants:

chemin

:/var/bla curr: 1.1 prev : 1,0

Je sais que cela fonctionne:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev} 

Mais j'espérais il y a un moyen plus court, comme:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev) 

Mes excuses si cela semble être une question trop pédant.

Répondre

13

Pourquoi ne pas:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev) 

BTW, j'ai changé les noms de couple que vous utilisiez qui foulent aux pieds les noms BUILTIN - ne en temps pas ça, il n'a jamais besoin et une fois gaspillerez beaucoup de votre temps à traquer un mauvais comportement qu'il provoque (où quelque chose utilise le nom interne en supposant que cela signifie le builtin mais vous l'avez caché avec le nom de notre propre variable).

12

Peut-être:

path = dict['path'] 
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 

Je veux dire cela fonctionne:

>>> dict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> path = dict['path'] 
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 
>>> str 
'path: /var/blah curr: 1.1 prev: 1.0' 

Je ne sais pas si l'on considère que plus court.

+2

Évitez utilise des locals() et globals() :( – dzen

+0

@dzen Pourquoi éviter locals()? J'ai essayé la recherche de ce conseil ailleurs et je ne suis pas trouver beaucoup. – bradreaves

+2

En utilisant ' locals() 'signifie que les variables que vous êtes ne sont pas claires Si vous voulez pylindre votre code, pylint pourrait indiquer que certaines variables n'ont pas été utilisées même si vous les avez référencées implicitement avec' locals() '. – hughdbrown

45

Vous pouvez essayer ceci:

data = {"path": "/var/blah", 
     "curr": "1.1", 
     "prev": "1.0"} 

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data 
+1

Ceci est beaucoup plus lisible et explicite. – neowulf33

21

Et bien sûr, vous pouvez utiliser la plus récente (de 2,6) méthode de chaîne .format:

>>> mydict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> 
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev) 
>>> s 
'path: /var/blah curr: 1.1 prev: 1.0' 

Ou, si tous les éléments étaient dans le dictionnaire, vous pourrait faire:

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0} 
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict) 
'path: /var/blah curr: 1.1 prev: 1.0' 
>>> 

De la documentation str.format():

Cette méthode de mise en forme de chaîne est la nouvelle norme en Python 3.0 et devrait être préféré à la mise en forme% décrit dans String Formatting Operations dans le nouveau code.

+3

En utilisant str.format, il pouvait écrire '" path: {mydict [chemin]} curr: {curr} prev: {prev} ". Format (mydict = mydict, curr = curr, prev = prev)' ou même 'locaux () 'pour l'argument de formatage," "chemin: {mydict [chemin]} curr: {curr} prev: {prev}". format (** locaux()) ' – johnny

2

Vous pouvez faire ce qui suit si vous placez vos données dans un dictionnaire:

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"} 

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data) 
+0

Ceci est le meilleur. – Bhargav

3

Vous pouvez également (bientôt) utiliser f-strings en Python 3.6, ce qui est probablement le chemin le plus court pour mettre en forme une chaîne:

print f'path: {path} curr: {curr} prev: {prev}' 

Et même mettre toutes vos données dans un dict:

d = {"path": path, "curr": curr, "prev": prev} 
print f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}' 
1

Si vous ne voulez pas ajouter les variables ne changent pas à votre dictionnaire à chaque fois, vous pouvez faire référence à la fois les variables et les clés de dictionnaire en utilisant le format:

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

Il est peut-être mauvaise forme logique, mais je t rend les choses plus modulaires attend curr et prev pour être principalement statique et le dictionnaire pour mettre à jour.

Questions connexes