Las muchas formas de formato de cadenas de Python: ¿las más antiguas (van a quedar) obsoletas?

Resuelto gerrit asked hace 12 años • 5 respuestas

Python tiene al menos seis formas de formatear una cadena:

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

Una breve historia de los diferentes métodos:

  • printf-El formato de estilo ha existido desde la infancia de Python.
  • La Templateclase se introdujo en Python 2.4.
  • El formatmétodo se introdujo en Python 2.6.
  • f-las cadenas se introdujeron en Python 3.6

Mis preguntas son:

  • ¿El formato -style está printfen desuso o va a quedar en desuso?
  • En el Template class, ¿el substitutemétodo está obsoleto o va a quedar obsoleto? (No me refiero a safe_substitute, que según tengo entendido ofrece capacidades únicas)

Preguntas similares y por qué creo que no están duplicadas:

  • Formato de cadena de Python: % frente a .format : trata solo los métodos 1 y 2 y pregunta cuál es mejor; mi pregunta es explícitamente sobre la desaprobación a la luz del Zen de Python

  • Opciones de formato de cadena: pros y contras : trata solo los métodos 1a y 1b en la pregunta, 1 y 2 en la respuesta, y tampoco nada sobre la desaprobación.

  • formato de cadena avanzado frente a cadenas de plantilla : principalmente sobre los métodos 1 y 3, y no aborda la obsolescencia

  • Expresiones de formato de cadena (Python) : la respuesta menciona que se planea que el enfoque '%' original quede obsoleto . Pero, ¿cuál es la diferencia entre la desaprobación planificada , la desaprobación pendiente y la desaprobación real ? Y el printfmétodo -style no genera ni siquiera un PendingDeprecationWarning, entonces, ¿esto realmente quedará obsoleto? Esta publicación también es bastante antigua, por lo que la información puede estar desactualizada.

Ver también

  • PEP 502: Interpolación de cadenas - Discusión ampliada
  • Formateador de cadenas
gerrit avatar Nov 19 '12 17:11 gerrit
Aceptado

El nuevo .format()método está destinado a reemplazar la %sintaxis de formato anterior. A este último se le ha restado importancia (pero aún no se ha desaprobado oficialmente ). La documentación del método lo indica:

Este método de formato de cadenas es el nuevo estándar en Python 3 y debe preferirse al %formato descrito en Operaciones de formato de cadenas en código nuevo.

(El énfasis es mío).

Para mantener la compatibilidad con versiones anteriores y facilitar la transición, por ahora se ha mantenido el formato antiguo . De la propuesta original PEP 3101 :

Compatibilidad al revés

La compatibilidad con versiones anteriores se puede mantener dejando los mecanismos existentes en su lugar. El nuevo sistema no choca con ninguno de los nombres de métodos de las técnicas de formato de cadenas existentes, por lo que ambos sistemas pueden coexistir hasta que llegue el momento de dejar de usar el sistema anterior.

Tenga en cuenta que hasta que llegue el momento de desaprobar el sistema anterior ; No ha quedado obsoleto, pero el nuevo sistema debe usarse siempre que escriba código nuevo .

El nuevo sistema tiene como ventaja que puedes combinar el enfoque de tupla y diccionario del antiguo %formateador:

"{greeting}, {0}".format(world, greeting='Hello')

y es extensible a través del object.__format__()gancho utilizado para manejar el formato de valores individuales.

Tenga en cuenta que el sistema antiguo tenía %la Templateclase, donde esta última le permite crear subclases que agregan o alteran su comportamiento. El sistema de nuevo estilo tiene la Formatterclase necesaria para llenar el mismo nicho.

Python 3 se ha alejado aún más de la obsolescencia y, en lugar de ello, le muestra una advertencia en la sección printf-style Formato de cadena :

Nota : Las operaciones de formato que se describen aquí presentan una variedad de peculiaridades que conducen a una serie de errores comunes (como no mostrar correctamente las tuplas y los diccionarios). El uso de los literales de cadena formateados más nuevos o la str.format()interfaz ayuda a evitar estos errores. Estas alternativas también proporcionan enfoques más potentes, flexibles y extensibles para dar formato al texto.

Python 3.6 también agregó literales de cadena formateados , que alinean las expresiones en las cadenas de formato. Estos son el método más rápido para crear cadenas con valores interpolados y deben usarse en lugar de str.format()donde se pueda usar un literal.

Martijn Pieters avatar Nov 19 '2012 10:11 Martijn Pieters

El %operador para el formato de cadenas no está obsoleto y no se eliminará, a pesar de las otras respuestas.
Cada vez que se plantea el tema en la lista de desarrollo de Python, existe una fuerte controversia sobre cuál es mejor, pero no hay controversia sobre si eliminar la forma clásica: permanecerá. A pesar de estar indicado en PEP 3101, Python 3.1 llegó y se fue, y %el formateo todavía existe.

Las declaraciones para mantener el estilo clásico son claras: es simple, es rápido, es rápido de hacer para cosas cortas. Usar el .formatmétodo no siempre es más legible, y casi nadie, incluso entre los desarrolladores principales, puede usar la sintaxis completa proporcionada por .formatsin tener que mirar la referencia. Incluso en 2009, uno tenía mensajes como este: http://mail. python.org/pipermail/python-dev/2009-October/092529.html : el tema apenas había aparecido en las listas desde entonces.

actualización 2016

En la versión actual de desarrollo de Python (que se convertirá en Python 3.6) existe un tercer método de interpolación de cadenas, descrito en PEP-0498 . Define un nuevo prefijo de cotización ( f""además del actual u""y ).b""r""

Al anteponer una cadena, fse llamará a un método en el objeto de cadena en tiempo de ejecución, que interpolará automáticamente variables del alcance actual en la cadena:

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'
jsbueno avatar Nov 19 '2012 13:11 jsbueno

Al observar los documentos anteriores de Python y PEP 3101, había una declaración de que el operador % quedará obsoleto y se eliminará del lenguaje en el futuro. La siguiente declaración estaba en los documentos de Python para Python 3.0, 3.1 y 3.2:

Dado que str.format() es bastante nuevo, gran parte del código Python todavía usa el operador %. Sin embargo, debido a que este antiguo estilo de formato eventualmente se eliminará del lenguaje, generalmente se debe usar str.format().

Si va a la misma sección en los documentos de Python 3.3 y 3.4, verá que esa declaración se ha eliminado. Tampoco puedo encontrar ninguna otra declaración en ningún otro lugar de la documentación que indique que el operador quedará obsoleto o se eliminará del idioma. También es importante señalar que PEP3101 no se ha modificado en más de dos años y medio (viernes, 30 de septiembre de 2011).

Actualizar

PEP461 Se acepta agregar % de formato a bytes y bytearray y debe ser parte de Python 3.5 o 3.6. Es otra señal de que el operador % está vivo y coleando.

Marwan Alsabbagh avatar Apr 30 '2014 06:04 Marwan Alsabbagh