2010-08-20 24 views
6

Alguien me ha demostrado recientemente que podemos imprimir variables en Python como lo hace Perl.¿Manera unpythonic de imprimir variables en Python?

En lugar de:

print("%s, %s, %s" % (foo, bar, baz)) 

podríamos hacer:

print("%(foo)s, %(bar)s, %(baz)s" % locals()) 

¿Hay una manera menos mirando hacky de variables de impresión en Python, como lo hacemos en Perl? Creo que la segunda solución realmente se ve muy bien y hace que el código sea mucho más legible, pero los lugareños() que andan por ahí lo hacen ver como una forma tan complicada de hacerlo.

+0

Esto se ve terriblemente cerca de http://stackoverflow.com/questions/3534714/python-equivalent-to-perls-qw ... –

+0

No, no lo hace. .. –

+1

http://stackoverflow.com/questions/1550479 (sin respaldo de las respuestas, que no he leído) –

Respuesta

9

La única otra manera sería utilizar los botones +/3.x método de Python 2.6 .format() de formateo de cadenas:

# dict must be passed by reference to .format() 
print("{foo}, {bar}, {baz}").format(**locals()) 

o hacer referencia a variables específicas por su nombre:

# Python 2.6 
print("{0}, {1}, {2}").format(foo, bar, baz) 

# Python 2.7/3.1+ 
print("{}, {}, {}").format(foo, bar, baz)  
+0

Esto no lo hace lucir exactamente más limpio. –

+1

Acabo de agregar los específicos para cuando se hace referencia a la variable directamente. La versión 2.7/3.1 + es definitivamente la más limpia de todas en mi opinión – jathanism

+3

Bien, hasta que empiezas a tirar de las cuerdas de una localizatio n base de datos. En ese punto, debe volver a usar ordenamientos explícitos porque diferentes idiomas prefieren diferentes órdenes de valores. (Realmente) –

2

Yo prefiero el .format() método yo mismo, pero siempre puede hacerlo:

age = 99 
name = "bobby" 
print name, "is", age, "years old" 

Pr Oduces: bobby is 99 years old. Observe los espacios implícitos.

O, usted puede conseguir realmente desagradable:

def p(*args): 
    print "".join(str(x) for x in args)) 

p(name, " is ", age, " years old") 
+1

¿Por qué harías eso? (La parte desagradable) – sharvey

+0

@sharvey, la pregunta es pedir unpythonic. – carl

1

La respuesta es no, la sintaxis de las cadenas en Python no incluye la sustitución de variables enel estilo de Perl (o Ruby, para el caso). Usar … % locals() es tan brillante como lo que va a obtener.

5

El uso de % locals() o .format(**locals()) no siempre es una buena idea. Como ejemplo, podría ser un posible riesgo de seguridad si la cadena se extrae de una base de datos de localización o podría contener datos del usuario, y mezcla la lógica del programa y la traducción, ya que tendrá que encargarse de las cadenas utilizadas en el programa.

Una buena solución es limitar las cadenas disponibles. Como ejemplo, tengo un programa que guarda algunas informaciones sobre un archivo. Todas las entidades de datos tienen un diccionario como éste:

myfile.info = {'name': "My Verbose File Name", 
       'source': "My Verbose File Source" } 

Entonces, cuando los archivos son procesos, que pueda hacer algo como esto:

for current_file in files: 
    print 'Processing "{name}" (from: {source}) ...'.format(**currentfile.info) 
    # ... 
+0

+1 Este es un buen punto. No sé por qué alguien lo menospreciaría. –

+0

Sí, vea http://stackoverflow.com/questions/1550479/python-is-using-vars-locals-a-good-practice/1551187#1551187 para obtener una discusión exhaustiva sobre por qué 'Explicit es mejor que implicit'. exactamente este contexto. – clacke

0

Como Python 3.6, usted podría tener lo que quería.

>>> name = "world" 
>>> print(f'hello {name}') 
hello world 

no el prefijo f

Cuestiones relacionadas