2009-08-20 13 views
19

Dado:Python interpolación de cadenas utilizando el diccionario y cuerdas

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

¿Cuál es la mejor manera/más corto para interpolar la cadena para generar el siguiente:

ruta:/var/bla Curr: 1.1 prev : 1,0

sé que esto funciona:

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

Pero yo estaba esperando que hay un camino más corto, como por ejemplo:

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

Mis disculpas si esto parece una cuestión excesivamente pedante.

Respuesta

13

Por qué no:

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

Por cierto, he cambiado un par de nombres que estaba usando que pasar por encima nombres incorporados - no hacen eso, nunca se necesita y de vez en cuando va a perder Mucho de tu tiempo rastrea una mala conducta que causa (donde algo está usando el nombre incorporado asumiendo que significa el built-in pero lo has ocultado con el nombre de nuestra propia variable).

12

Tal vez:

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

me refiero funciona:

>>> 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' 

acabo no sé si tenemos en cuenta que más corto.

+2

Evitar utiliza de gente() y globales() :( – dzen

+0

@dzen Por qué evitar los locales()? He intentado buscar este consejo en otro lugar y no estoy encontrando mucho. – bradreaves

+2

Uso de ' locals() 'significa que no está claro qué variables es en realidad. Si quisiera insertar su código, pylint bien podría informar que algunas variables no se usaron aunque las haya referenciado implícitamente con' locals() '. Pylint tendría para examinar todas las instrucciones de formato de cadena para dicho uso implícito. Por lo tanto, es un atajo cuyas implicaciones debe comprender antes de usar. – hughdbrown

45

Puede probar esto:

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

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

Esto es mucho más legible y explícito. – neowulf33

21

Y, por supuesto, se puede utilizar la más reciente (de 2.6) .format método de cadena:

>>> 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' 

O, si todos los elementos estaban en el diccionario, podría hacer esto:

>>> 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 documentación str.format():

Este método de formato de cadenas es el nuevo estándar en Python 3.0, y debe preferirse a la% el formato descrito en String Formatting Operations en nuevo código.

+3

Usando str.format podría escribir '" ruta: {mydict [ruta]} curr: {curr} prev: {prev} ". Formato (mydict = mydict, curr = curr, prev = prev)' o incluso 'locales () 'para el argumento a formatear,' "ruta: {mydict [ruta]} curr: {curr} prev: {prev}". formato (** locals()) ' – johnny

2

puede hacer lo siguiente si se colocan los datos dentro de un diccionario:

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

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

Este es el mejor. – Bhargav

3

Puede también (en breve) f-strings utilizar en Python 3.6, que es probablemente el camino más corto para dar formato a una cadena:

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

e incluso poner todos sus datos dentro de un dict:

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

Si no desea agregar las variables que no cambian a su diccionario de cada vez, puede hacer referencia tanto a las variables y las claves de diccionario utilizando el formato:

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

podría ser mala forma lógicamente, pero yo t hace las cosas más modulares esperando que curr y prev sean mayormente estáticos y que el diccionario se actualice.

Cuestiones relacionadas