2009-06-15 35 views
113

¿Qué significa% s en Python? ¿Y qué hace el siguiente bit de código?¿Qué significa% s en Python?

Por ejemplo ...

if len(sys.argv) < 2: 
    sys.exit('Usage: %s database-name' % sys.argv[0]) 

if not os.path.exists(sys.argv[1]): 
    sys.exit('ERROR: Database %s was not found!' % sys.argv[1]) 
+3

El operador '%' está en desuso en favor del método 'str.format', más potente, ver [PEP-3101] (http://docs.python.org/3.1/whatsnew/2.6.html#pep -3101). –

+20

Actualmente, PEP dice "En Python 3.0, el operador% se complementa con un método de formato de cadenas más potente" y que se transfiere a Python 2.6. De dónde vengo "complementado" significa agregado, no reemplazado. El PEP no dice "suplantado" y en ninguna parte del PEP dice que el operador% está en desuso (sin embargo, dice que otras cosas están en desuso en la parte inferior). Es posible que prefiera str.format y eso está bien, pero hasta que haya un PEP que diga que está en desuso, no tiene sentido afirmar que es cuando no lo es. – Ben

Respuesta

138

Es una sintaxis de formato de cadenas (que se toma prestado de C).

Por favor, vea "Formatting Strings":

Python soporta valores de formato en cuerdas. Aunque esto puede incluir expresiones muy complicadas , el uso básico más es insertar valores en una cadena con el marcador de posición %s.

Editar: Aquí es un ejemplo muy simple:

name = raw_input("who are you?") 
print "hello %s" % (name,) 

El token %s me permite insertar (y potencialmente formato) una cadena. Observe que el token %s se reemplaza por lo que pase a la cadena después del símbolo %. Observe también que también estoy usando una tupla aquí (cuando solo tiene una cadena que usa una tupla es opcional) para ilustrar que múltiples cadenas se pueden insertar y formatear en una sola declaración.

+0

Gracias a los dos. ¡muy útil! – Tyler

+0

El enlace Cadenas de formato se ha ido – Sherlock

+5

Tenga en cuenta que este tipo de interpolación de cadenas está en desuso en favor del método más poderoso 'str.format'. –

8

'% s' indica un tipo de conversión de 'cadena' cuando se usan las capacidades de formateo de cadenas de Python. Más específicamente, '% s' convierte un valor especificado en una cadena usando la función str(). Compare esto con el tipo de conversión '% r' que usa la función repr() para la conversión de valores.

Tome un vistazo a la siguiente: http://docs.python.org/library/stdtypes.html#string-formatting-operations

5

En respuesta a la segunda pregunta: ¿Qué hace este código hacer ...

Este es el código de comprobación de errores bastante estándar para una secuencia de comandos de Python que? acepta argumentos de línea de comandos.

Así que la primera declaración if se traduce a: si no me has pasado una discusión, voy a decirte cómo debes pasarme una discusión en el futuro, por ej. verá esta pantalla en:

Usage: myscript.py database-name 

Los próximos if comprobaciones de los estados para ver si el 'nombre de base de datos' que ha pasado a la secuencia de comandos que realmente existe en el sistema de archivos. Si no es así, obtendrá un mensaje como este:

ERROR: Database database-name was not found! 

Desde el documentation:

argv [0] es el nombre del script (que depende sistema operativo si este es un servicio completo ruta de acceso o no). Si el comando se ejecutó utilizando la opción de línea de comando -c en el intérprete , argv [0] se establece en la cadena '-c'. Si no se ha transferido ningún nombre de script al pasado al intérprete de Python, argv [0] es la cadena vacía.

75

La respuesta de Andrew es buena.

Y sólo para ayudarle a salir un poco más, así es como se utiliza el formato múltiple en una cadena

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike". 

Si está utilizando enteros en lugar de cadena, utilice% d en lugar de% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12 
+2

agradable. % d te evita lanzar cast (int). ¿Alguna idea de lo que representan% sy% d? supongo que los recordaré como cuerda y dígito. – user391339

+0

@ user391339 significa decimal :) están todos aquí https://docs.python.org/2/library/stdtypes.html#string-formatting-operations – sqram

16

El método format se introdujo en Python 2.6. Es más capaz y no mucho más difícil de usar:

>>> "Hello {}, my name is {}".format('john', 'mike') 
'Hello john, my name is mike'. 

>>> "{1}, {0}".format('world', 'Hello') 
'Hello, world' 

>>> "{greeting}, {}".format('world', greeting='Hello') 
'Hello, world' 
+5

Esta respuesta mejoraría si explicara que la sintaxis en el la pregunta estaba formateando el texto y _then_ demostró el método más nuevo. De esa manera podría sostenerse por sí mismo. Proporcionar un ejemplo que sea equivalente al ejemplo en la pregunta también sería un plus. –

2

El% s es conocido como un especificador de formato, específicamente para las cadenas. Como la discusión sobre los tipos de datos continúa a lo largo de este libro, eche un vistazo a varios más, cada uno específico para su tipo de datos dado. Cada especificador actúa como un marcador de posición para ese tipo en la cadena; y después de la cadena, el signo% fuera de de la cadena indica que después de ella, todos los valores que se insertarán en el especificador de formato serán presentados allí para ser utilizados en la cadena. Puede observar los paréntesis. Esto le dice a la cadena que debe esperar ver una secuencia que contiene los valores que utilizará la cadena para rellenar sus especificadores de formato. Una manera más simple de pensarlo es imaginar que% s es un contenedor de almacenamiento que contiene el valor en el paréntesis . Si desea hacer más de un valor, simplemente debe agregar otro especificador de formato, de esta manera:
">>>" John% s% s "% (" Todos "," Hombre ")
John Everyman '