Las muchas formas de formato de cadenas de Python: ¿las más antiguas (van a quedar) obsoletas?
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
Template
clase se introdujo en Python 2.4. - El
format
método se introdujo en Python 2.6. f
-las cadenas se introdujeron en Python 3.6
Mis preguntas son:
- ¿El formato -style está
printf
en desuso o va a quedar en desuso? - En el
Template class
, ¿elsubstitute
método está obsoleto o va a quedar obsoleto? (No me refiero asafe_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
printf
método -style no genera ni siquiera unPendingDeprecationWarning
, 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
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 Template
clase, donde esta última le permite crear subclases que agregan o alteran su comportamiento. El sistema de nuevo estilo tiene la Formatter
clase 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.
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 .format
método no siempre es más legible, y casi nadie, incluso entre los desarrolladores principales, puede usar la sintaxis completa proporcionada por .format
sin 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, f
se 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.'
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.