Soy un gran fanático del uso de diccionarios para formatear cadenas. Me ayuda a leer el formato de cadena que estoy usando, así como a aprovechar los diccionarios existentes. Por ejemplo:
class MyClass:
def __init__(self):
self.title = 'Title'
a = MyClass()
print 'The title is %(title)s' % a.__dict__
path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()
Sin embargo, no puedo entender la sintaxis de python 3.x para hacer lo mismo (o si eso es posible). Me gustaria hacer lo siguiente
# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)
# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)
python
string
dictionary
python-3.x
Doran
fuente
fuente
¿Esto es bueno para ti?
fuente
format_map
. Similar astr.format(**mapping)
, excepto quemapping
se usa directamente y no se copia adict
. Esto es útil si, por ejemplo,mapping
es una subclase dictprint(**geopoint)
es decir, es igual queprint(longitude=71.091, latitude=41.123)
. En muchos idiomas, se conoce como operador splat . En JavaScript, se llama operador de propagación . En python, no hay un nombre particular dado a este operador.Para descomprimir un diccionario en argumentos de palabras clave, use
**
. Además, el formato de nuevo estilo admite referencias a atributos de objetos y elementos de asignaciones:fuente
'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
defaultdict
y no tiene todas las clavesComo Python 3.0 y 3.1 tienen EOL y nadie los usa, usted puede y debe usar
str.format_map(mapping)
(Python 3.2+):Lo que esto significa es que puede usar, por ejemplo, un valor
defaultdict
que establecería (y devolvería) un valor predeterminado para las claves que faltan:Incluso si el mapeo proporcionado es una
dict
subclase, no una subclase, probablemente aún sería un poco más rápido.Sin embargo, la diferencia no es grande, dado
luego
es aproximadamente 10 ns (2%) más rápido que
en mi Python 3.4.3. La diferencia probablemente sería mayor a medida que haya más claves en el diccionario, y
Tenga en cuenta que el lenguaje de formato es mucho más flexible que eso; pueden contener expresiones indexadas, accesos de atributos, etc., para que pueda formatear un objeto completo o 2 de ellos:
A partir de 3.6 también puede usar las cadenas interpoladas:
Solo necesita recordar usar los otros caracteres de comillas dentro de las comillas anidadas. Otra ventaja de este enfoque es que es mucho más rápido que llamar a un método de formateo.
fuente
format
? (Dado que no se copia a un dict)'%(latitude)s %(longitude)s'%geopoint
;)fuente
La sintaxis de Python 2 también funciona en Python 3:
fuente
f""
"".format()
fuente
print('%(latitude)s %(longitude)s'%geopoint)
esto también es significativamente más rápido que los otros 2'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
La mayoría de las respuestas formatearon solo los valores del dict.
Si también desea formatear la clave en la cadena, puede usar dict.items () :
Salida:
Si desea formatear de forma arbitraria, es decir, no mostrar los valores-clave como las tuplas:
Salida:
fuente
geopoint.items()
;)