multiple float examples python printf string-formatting deprecated backwards-compatibility

python - float - Pitones muchas formas de formateo de cadenas-¿las más viejas(van a ser) obsoletas?



python string format (4)

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 formato de estilo printf ha existido desde la infancia de Pythons
  • La clase de Template se introdujo en Python 2.4
  • El método de format se introdujo en Python 2.6
  • f -strings fueron introducidos en Python 3.6

Mis preguntas son:

  • ¿El formato de estilo de impresión está en desuso o va a estar en desuso?
  • En la Template class , ¿el método substitute desuso o va a estar en desuso? (No estoy hablando de safe_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 : solo trata los métodos 1a y 1b en la pregunta, 1 y 2 en la respuesta, y también nada sobre desaprobación

  • formateo de cadenas avanzadas frente a cadenas de plantillas , principalmente sobre los métodos 1 y 3, y no aborda la desaprobación

  • Expresiones de formato de cadena (Python) : la respuesta menciona que el enfoque ''%'' original está en desuso . Pero, ¿cuál es la diferencia entre planeado estar en desuso , pendiente de desaprobación y desaprobación real? Y el método de estilo de PendingDeprecationWarning no PendingDeprecationWarning ni siquiera una PendingDeprecationWarning , por lo que ¿esto realmente va a ser obsoleto? Esta publicación también es bastante antigua, por lo que la información puede estar desactualizada.

Consulte también PEP 502: Interpolación de cadenas - Discusión ampliada


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

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 el código nuevo.

(Énfasis mío).

Para mantener la compatibilidad con versiones anteriores y facilitar la transición, el formato antiguo se ha dejado en su lugar por el momento . 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 colisiona con ninguno de los nombres de métodos de las técnicas de formateo de cadenas existentes, por lo que ambos sistemas pueden coexistir hasta que llegue el momento de desaprobar el sistema anterior.

Tenga en cuenta que hasta llega el momento de desaprobar el sistema anterior ; no ha sido desaprobado, pero el nuevo sistema se utilizará cada vez que escriba un nuevo código .

El nuevo sistema tiene la ventaja de que puede combinar el enfoque de tupla y diccionario del formateador % :

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

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

Tenga en cuenta que el sistema antiguo tenía % y la clase de Template , donde este último le permite crear subclases que agregan o modifican su comportamiento. El sistema de estilo nuevo tiene la clase de Formatter para llenar el mismo nicho.

Python 3 se ha alejado aún más de la obsolescencia, en su lugar le da una advertencia en la sección de formato de printf estilo printf :

Nota : Las operaciones de formateo descritas aquí exhiben una variedad de peculiaridades que conducen a una serie de errores comunes (como la falla al visualizar tuplas y diccionarios correctamente). Usar los literales de cadena formateados más nuevos o la interfaz str.format() ayuda a evitar estos errores. Estas alternativas también proporcionan enfoques más potentes, flexibles y extensibles para formatear texto.

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


El operador % para el formato de cadenas no está en desuso, 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 ser denotado en PEP 3101, Python 3.1 había venido y se había ido, y el formato % todavía está disponible.

Las declaraciones para mantener el estilo clásico son claras: es simple, es rápido, rápido para cosas cortas. El uso del método .format no siempre es más fácil de leer, 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 de desarrollo de Python actual (que se convertirá en Python 3.6) hay un tercer método de interpolación de cadenas, descrito en PEP-0498 . Define un nuevo prefijo de cotización f"" (además de la actual u"" , b"" r"" ).

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

>>> value = 80 >>> f''The value is {value}.'' ''The value is 80.''


En cuanto a los documentos anteriores de Python y PEP 3101, hubo una afirmación de que el operador% quedará obsoleto y se eliminará del idioma en el futuro. La siguiente declaración estaba en los documentos de Python para Python 3.0, 3.1 y 3.2:

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

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

Actualizar

PEP461 agregar 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.


La última posición de Guido sobre esto parece estar indicada aquí:

Qué hay de nuevo en Python 3.0

PEP 3101: un nuevo enfoque para el formateo de cadenas

Un nuevo sistema para las operaciones de formateo de cadenas incorporadas reemplaza al operador de formato% string. (Sin embargo, el operador% aún es compatible, quedará obsoleto en Python 3.1 y se eliminará del lenguaje en algún momento posterior). Lea PEP 3101 para obtener la primicia completa.

Y el PEP3101 en sí, que tiene la última modificación que data de (viernes, 30 de septiembre de 2011), por lo que no hay progreso en los últimos, supongo.