2011-10-28 10 views
7

Digamos que tengo un diccionario con puntos en el nombre de los campos, como {'person.name': 'Joe'}. Si quisiera usar esto en str.format, ¿es posible?python: puntos en el nombre de la variable en una cadena de formato

Mi primer instinto fue

'Name: {person.name}'.format(**{'person.name': 'Joe'}) 

pero esto sólo funcionaría si mi dict tenían la forma de

{'person':{'name':Joe}} 

The relevant manual docs section no menciona todas maneras de escapar del punto.

(Nota al margen: pensé que por lo general

def func(**kw): print(kw) 
func(**{'a.b': 'Joe'}) 

causaría un error, pero la llamada a la función ** -EXPANDED parece funcionar incluso si son no identificadores válidos Se hace error fuera! . relativa a los no-strings aunque o_O)

+0

¿Has intentado escapar del punto con una barra invertida? –

+0

@RafeKettler: Sí. Eso no funciona porque lo está escapando por la cadena, no por el especificador de formato. – nfirvine

+0

Posible duplicado de [Cómo usar un punto en cadenas de formato Python?] (Http://stackoverflow.com/questions/29035168/how-to-use-a-dot-in-python-format-strings) –

Respuesta

5
'Name: {0[person.name]}'.format({'person.name': 'Joe'}) 
+0

Cerrar pero eso solo funcionaría si pasas un diccionario con una sola tecla, una para cada reemplazo posicional. Por ejemplo, esto no funcionaría: ''Nombre: {0 [person.name]} Age: {1 [person.age]}'. Format ({'person.name': 'Joe', 'person.age': 42 }) ' – jathanism

+2

Pero puede repetir 0 tantas veces como sea necesario. Esto funciona bien: ''Nombre: {0 [person.name]} Edad: {0 [person.age]}'. Format ({'person.name': 'Joe', 'person.age': 42}) ' –

+0

Impresionante, no sabía que podrías hacer eso y aprendí algo. ¡Gracias! :) – jathanism

3

Una forma de evitar esto es usar la vieja % formato (que no ha quedado en desuso todavía):

>>> print 'Name: %(person.name)s' % {'person.name': 'Joe'} 
Name: Joe 
0

tuve problema similar y lo solucioné heredando de string.Formatter:

import string 

class MyFormatter(string.Formatter): 
    def get_field(self, field_name, args, kwargs): 
     return (self.get_value(field_name, args, kwargs), field_name) 

sin embargo no se puede utilizar str.format() porque todavía está señalando edad formateador y hay que ir así

>>> MyFormatter().vformat("{a.b}", [], {'a.b': 'Success!'}) 
'Success!' 
Cuestiones relacionadas