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 Pythons- 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
printf
formato de estilo está obsoleto o va a quedar obsoleto? - En el
Template class
, ¿elsubstitute
método está obsoleto o va a quedar obsoleto? (No estoy hablando de losafe_substitute
que, según tengo entendido, ofrece capacidades únicas)
Preguntas similares y por qué creo que no son duplicados:
Formato de cadena de Python:% vs. .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 '%' sea 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 aPendingDeprecationWarning
, entonces, ¿realmente va a quedar obsoleto? Esta publicación también es bastante antigua, por lo que la información puede estar desactualizada.
Formatter
clase?Respuestas:
Si bien hay varias indicaciones en los documentos de que
.format
las cadenas de f son superiores a las%
cadenas, no hay un plan sobreviviente para desaprobar este último.En el problema de confirmación # 14123: mencione explícitamente que el formato de cadena de% de estilo antiguo tiene salvedades, pero que no desaparecerá pronto. , inspirado en el problema Indique que no hay planes actuales para desaprobar el formato de estilo printf , los documentos sobre
%
-formatting fueron editados para contener esta frase:(El énfasis es mío.)
Esta frase se eliminó más tarde, en la confirmación Close # 4966: renovar los documentos de secuencia para explicar mejor el estado de Python moderno . Esto puede parecer una señal de que un plan para desaprobar el
%
formato estaba de vuelta en las cartas ... pero sumergirse en el rastreador de errores revela que la intención era la opuesta. En el rastreador de errores, el autor de la confirmación caracteriza el cambio de esta manera :En otras palabras, hemos tenido dos cambios consecutivos en los
%
documentos de formato destinados a enfatizar explícitamente que no se desaprobará, y mucho menos se eliminará. Los documentos siguen opinando sobre los méritos relativos de los diferentes tipos de formato de cadena, pero también tienen claro que el%
formato no quedará obsoleto ni se eliminará.Además, el cambio más reciente a ese párrafo , en marzo de 2017, lo cambió de este ...
... a esto:
Observe el cambio de "ayuda a evitar" a "puede ayudar a evitar", y cómo la clara recomendación de
.format
y las cuerdas de f se han reemplazado por una prosa ambigua y equívoca sobre cómo cada estilo "proporciona sus propias compensaciones y beneficios" . Es decir, no solo una desaprobación formal ya no está en las tarjetas, sino que los documentos actuales reconocen abiertamente que el%
formateo al menos tiene algunos "beneficios" sobre los otros enfoques.De todo esto inferiría que el movimiento para desaprobar o eliminar el
%
formato no solo ha fallado, sino que ha sido derrotado completa y permanentemente.fuente
%
. Ahora que se ha eliminado la política de "no modificar códigos a gran escala", sus objeciones también se están desvaneciendo. A la larga, el mantenimiento de ambos formularios sin beneficios restantes, ya que%
en algún momento la sintaxis printf se eliminará de todos modos. Simplemente no sabemos cuándo todavía, por lo que valió la pena bajar el tono del lenguaje.El nuevo
.format()
método está destinado a reemplazar la%
sintaxis de formato anterior. A este último se le ha quitado el énfasis (pero aún no se ha desaprobado oficialmente ). La documentación del método dice tanto:(Énfasis mío).
Para mantener la compatibilidad con versiones anteriores y facilitar la transición, el formato anterior se ha dejado en su lugar por ahora . De la propuesta PEP 3101 original :
Tenga en cuenta el hasta que llegue el momento de desaprobar el sistema anterior ; no ha quedado obsoleto, pero el nuevo sistema se utilizará siempre que escriba código nuevo .
El nuevo sistema tiene la ventaja de que puede combinar el enfoque de tupla y diccionario del antiguo
%
formateador:y es extensible a través del
object.__format__()
enlace utilizado para manejar el formato de valores individuales.Tenga en cuenta que el sistema anterior tenía
%
y laTemplate
clase, donde este último le permite crear subclases que agregan o alteran su comportamiento. El sistema de nuevo estilo tiene laFormatter
clase para llenar el mismo nicho.Python 3 se ha alejado aún más de la obsolescencia, en lugar de darle una advertencia en la sección de
printf
formato de cadena de estilo :Python 3.6 también agregó literales de cadena formateados , que integran las expresiones en las cadenas de formato. Este es el método más rápido para crear cadenas con valores interpolados y debe usarse en lugar de
str.format()
donde se pueda usar un literal.fuente
Formatter
puedes crear formatos personalizados como los quedatetime
usan los objetos. Además, dado que.format
es una función, puede usarla para crear formato perezoso invocable de forma más directa: por ejemplo,fmt = '{} - {}'.format; fmt(a, b)
Template
se relaciona con%
o con el sistema antiguo . En particular, el PEP que vincula estados Si bien existe cierta superposición entre esta propuesta ystring.Template
, se considera que cada uno responde a una necesidad distinta, y que uno no obvia al otro. En su respuesta, uno puede estar confundido de que elTemplate
formateo, al ser parte del sistema anterior , también está obsoleto.Formatter
clase puede cubrir las mismas necesidades questring.Template()
.[...]should be preferred to the % formatting[...]
esta parte se ha eliminado de la documentación. docs.python.org/3/library/stdtypes.html#str.formatEl
%
operador para el formato de cadena 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: se mantendrá. A pesar de estar indicado en PEP 3101, Python 3.1 había aparecido y desaparecido, y el
%
formato todavía existe.Las afirmaciones para mantener el estilo clásico son claras: es simple, es rápido, es rápido para hacer 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 de 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 cita
f""
(además del actualu""
,b""
yr""
).El prefijo de una cadena
f
llamará a un método en el objeto de cadena en tiempo de ejecución, que interpolará automáticamente las variables del alcance actual en la cadena:fuente
__format__
. Por ejemplo,format(Decimal('0.1'), '.20f')
vs'%.20f' % Decimal('0.1')
. Este último convierte el decimal en un flotador.f
en Python 3?f-strings
que se usan arriba son una nueva característica en el lenguaje a partir de Python 3.6. No existe en versiones anteriores y generará un error de sintaxis en ellas.La última posición de Guido sobre esto parece indicarse aquí:
Novedades de Python 3.0
Y el PEP3101 en sí, que tiene la última modificación que se remonta al (viernes, 30 de septiembre de 2011), por lo que no hay progreso últimamente en ese, supongo.
fuente
Al observar los documentos de Python más antiguos y PEP 3101, se dijo 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:
Si va a la misma sección en los documentos de Python 3.3 y 3.4, verá que esa declaración ha sido eliminada. 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.
fuente