Python tiene por lo menos seis maneras de dar formato a 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 ha sido alrededor desde los Pitones de la infancia
  • La Template clase se introdujo en Python 2.4
  • La format método fue introducido en Python 2.6
  • f-cadenas se introdujeron en Python 3.6

Mis preguntas son:

  • Es printf-formato de estilo obsoleto, o va a ser obsoleto?
  • En el Template class, es el substitute método obsoleto, o va a ser obsoleto? (No estoy hablando de safe_substitute, que como yo lo entiendo ofrece capacidades únicas)

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

  • Python cadena de formato: % vs .formato — solo trata los métodos 1 y 2, y la pregunta de cual es mejor; mi pregunta es explícitamente sobre la desaprobación en la luz del Zen de Python

  • Cadena de opciones de formato: pros y contras — solo trata de los métodos de 1a y 1b en la pregunta 1 y 2 en la respuesta, y también nada acerca de la obsolescencia

  • avanzadas de formato de cadena vs cadenas de plantillas — sobre todo acerca de los métodos 1 y 3, y no la dirección de obsolescencia

  • El formato de cadena de expresiones (Python) — respuesta menciona que el original ‘%’ enfoque está previsto para ser obsoleto. Pero ¿cuál es la diferencia entre planeado para ser obsoleto, pendiente de amortización y real desuso? Y el printfestilo método no levantar siquiera un PendingDeprecationWarning, así es esto realmente va a ser obsoleto? Este post es bastante antiguo, por lo que la información puede estar desactualizada.

Ver también

  • Qué debo señalar que se olvidó de la Formatter de la clase?
InformationsquelleAutor gerrit | 2012-11-19

5 Comentarios

  1. 6

    Mientras que hay varias indicaciones en la documentación que .format y f-cadenas son superiores a % cadenas, no hay sobrevivientes plan nunca van a dejar de usar el último.

    De cometer el Tema de #14123: mencione Explícitamente que el antiguo estilo de % cadena de formato tiene advertencias, pero no va a desaparecer en cualquier momento pronto., inspirada en cuestión Indican que no hay planes actuales para desaprobar printf-formato de estilo, los documentos en %-formato fueron editadas para contener esta frase:

    Como el nuevo formato de cadena sintaxis es más flexible y asas de tuplas y diccionarios, naturalmente, se recomienda para el nuevo código. Sin embargo, no hay planes actuales para desaprobar printf-formato de estilo de.

    (El énfasis es mío.)

    Esta frase fue retirado más tarde, en cometer Close #4966: la modernización de la secuencia de google docs en el fin de explicar mejor el estado de la moderna Python. Esto podría parecer un signo de que un plan para desaprobar % formato estaba de vuelta en las tarjetas… pero de buceo en el bug tracker revela que la intención era la contraria. En el bug tracker, el autor de la confirmación caracteriza el cambio como este:

    • cambiado la prosa que describe la relación entre printf-formato de estilo y la str.método format (deliberadamente la eliminación de la implicación de que el primero es ningún peligro real de desaparición – simplemente no es práctico para nosotros serio contemplar la matanza apagado)

    En otras palabras, hemos tenido dos días consecutivos de cambios en el %-formato de google docs pretende explícitamente destacar que no ser obsoleto, y no digamos eliminado. Los documentos siguen siendo críticos en los méritos relativos de los diferentes tipos de formato de cadena, pero también está claro que el %-formato no se va a conseguir en desuso o eliminado.

    Lo que es más, la la mayoría de los cambios recientes a ese párrafo, en Marzo de 2017, cambió a partir de este…

    El formato de operaciones aquí descritas muestran una serie de peculiaridades que conducen a una serie de errores comunes (como no podía mostrar tuplas y diccionarios correctamente). El uso de las nuevas formato de literales de cadena o el str.format interfaz ayuda a evitar estos errores. Estas alternativas también proporcionan más potente, flexible y extensible enfoques para el formato de texto.

    … a esto:

    El formato de operaciones aquí descritas muestran una serie de peculiaridades que conducen a una serie de errores comunes (como no podía mostrar tuplas y diccionarios correctamente). El uso de las nuevas formato de literales de cadena, el str.format de la interfaz, o cadenas de plantillas puede ayudar a evitar estos errores. Cada una de estas alternativas ofrece sus propias ventajas y desventajas y ventajas de la simplicidad, flexibilidad, y/o extensibilidad.

    Notar el cambio de «ayuda a evitar la» a «puede ayudar a evitar», y cómo la clara recomendación de .format y f-cadenas ha sido sustituido por esponjoso, equívoca prosa acerca de cada estilo de «ofrece sus propias ventajas y desventajas y beneficios». Es decir, no sólo es una forma en desuso ya no está en las cartas, pero el actual docs son reconocer abiertamente que % formato en el que menos tiene algunos «beneficios» a través de los otros enfoques.

    Me gustaría deducir de todo esto que el movimiento para descartar o eliminar % formato no sólo ha fracasado, sino que ha derrotado a fondo y de forma permanente.

    • El mullido cambio de idioma se añadió para aplacar a los Mercurial mantenedores (Entre otros) que no quiere ver Mercurial dejado atrás con un código base demasiado grande para erradicar el uso de %. Ahora que el ‘no a gran escala, el código de mods’ de la política ha sido desechada, sus objeciones son la decoloración demasiado. En el largo plazo, el mantenimiento de ambas formas, sin beneficios restantes para % en algún momento la sintaxis de printf será eliminado de todos modos. No sabemos cuando, sin embargo, y de forma que el idioma era la pena bajar el tono.
    • Interesante. Suena como que usted tiene una gran cantidad de conocimiento acerca de esta decisión, que me falta. Para lo que vale, creo que un bien que se hace referencia respuesta de usted contornear de estos puntos (ya sea como una nueva respuesta, o una edición de su ya existente) tendría valor.
  2. 53

    La nueva .format() método está destinado a sustituir a la antigua % formato de sintaxis. La última ha sido de relieve, (pero no oficialmente obsoleto sin embargo). La documentación del método de los estados como mucho:

    Este método de cadena de formato es el nuevo estándar de Python 3, y debe ser preferido a la % formato descrito en el Formato de Cadena de Operaciones en el nuevo código.

    (El énfasis es mío).

    Para mantener la compatibilidad hacia atrás y a hacer la transición más fácil, el formato antiguo ha quedado en su lugar por ahora. A partir de la original PEP 3101 propuesta:

    Compatibilidad Hacia Atrás

    Compatibilidad hacia atrás puede ser mantenida por salir de la existente
    mecanismos en su lugar. El nuevo sistema no chocar con alguno de
    los nombres de método de la cadena existente técnicas de formato, por lo que
    ambos sistemas pueden coexistir hasta que llega el momento de descartar la
    sistema antiguo.

    Nota la hasta que llegue el momento van a dejar de usar el antiguo sistema; no ha quedado obsoleta, pero el nuevo sistema va a ser utilizado siempre que se escribe nuevo código.

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

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

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

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

    Python 3 tiene más alejado en desuso, en lugar de dar de advertencia, en el printfestilo de Formato de Cadena de la sección:

    Nota: El formato de las operaciones descritas aquí se muestran una serie de peculiaridades que conducen a una serie de errores comunes (como no podía mostrar tuplas y diccionarios correctamente). El uso de las nuevas formato de literales de cadena o la str.format() interfaz ayuda a evitar estos errores. Estas alternativas también proporcionan más potente, flexible y extensible enfoques para el formato de texto.

    Python 3.6 también añadió formato de literales de cadena, que en la línea de las expresiones en las cadenas de formato. Estos son el método más rápido de la creación de cadenas con valores interpolados, y debe ser usado en lugar de str.format() dondequiera que usted puede utilizar un literal.

    • Y con Formatter puede crear formatos personalizados como los que datetime objetos de uso. También, desde .format es una función, se puede utilizar para crear exigible perezoso formato más directamente: por ejemplo, fmt = '{} - {}'.format; fmt(a, b)
    • No veo cómo Template está relacionado con % o a la antiguo sistema de. En particular, los de PEP el enlace de los estados Mientras que hay una cierta coincidencia entre esta propuesta y string.Template, se considera que cada una tiene una necesidad diferente, y que la una no excluye la otra. En su respuesta uno puede ser confundido que Template formato, siendo parte de la antiguo sistema de, es obsoleto demasiado.
    • A la derecha, creo que me perdí esa parte; pero en mi opinión el Formatter clase puede llenar las necesidades de string.Template().
    • [...]should be preferred to the % formatting[...] esta parte ha sido retirado de la documentación. docs.python.org/3/library/stdtypes.html#str.format
    • Creo que esta respuesta es actualmente engañosa; el primer pasaje citado ha sido retirado de la Python 3 docs, y parece bastante claro para mí que no hay ningún resto de intención para una desatención para tomar su lugar. Esta respuesta todavía tiene valor histórico, pero yo estaría inclinado a modificar la redacción para evitar cualquier sugerencia de que una desatención todavía está en las cartas, y para editar gran parte de la primera mitad de la respuesta en el tiempo pasado. Voy a hacerlo yo mismo en algún momento si no se oponen, sino que pensaba que me gustaría comentar primero para darle la oportunidad de hacer cambios a ti mismo si quieres.
    • No estoy de acuerdo. El pasaje es allí, en la documentación de Python 2. El Python 2 documentación no es estática, que todavía se utiliza la misma expresión es significativa y str.format() ahora es el formato por defecto el método a utilizar. Tenga en cuenta que el PEP también se sigue utilizando el mismo lenguaje, sin alterar El texto en Python 3 docs se ha ido sólo porque el viejo estilo de % documentación ha sido renovado y se trasladó a la de enfatizar el papel.
    • Justo lo suficiente. Me quedo con mi crítica de esta respuesta; creo que te equivocas de leer cualquier cosa en la prosa restantes en Python 2 docs, y creo que definitivamente hay ninguna posibilidad de una desatención por razones que resumo en mi respuesta y de otros en otras respuestas aquí, pero no lo voy a editar para cambiar fundamentalmente el significado de su respuesta a uno no está de acuerdo.

  3. 43

    La % operador de formato de cadena no es obsoleto y no se va a quitar – a pesar de las otras respuestas.

    Cada vez que el sujeto se produce en el desarrollo de Python lista, existe una fuerte controversia sobre cuál es mejor, pero hay controversia sobre si se debe quitar la manera clásica – se quedará. A pesar de ser mostrados en PEP 3101, Python 3.1 había llegado y se han ido, y % formato todavía está alrededor.

    Las instrucciones para el mantenimiento de estilo clásico son claras: es simple, es rápido, es rápida de hacer, para abreviar las cosas. El uso de la .format método no siempre es más legible – y casi nadie – incluso entre los desarrolladores principales, puede utilizar la sintaxis completa proporcionada por .format sin tener que mirar la referencia
    Incluso, en 2009, uno tenía un mensaje como este: http://mail.python.org/pipermail/python-dev/2009-October/092529.html – el sujeto tenía apenas apareció en las listas, ya.

    2016 actualización

    Actual de Python versión de desarrollo (que se convertirá en Python 3.6) existe un tercer método de interpolación de cadenas, que se describe en PEP-0498. Define una nueva cita prefijo f"" (además de la actual u"", b"" y r"").

    Prefijando una cadena f va a llamar a un método en el objeto string en tiempo de ejecución, lo que automáticamente interpolar las variables del ámbito actual en la cadena:

    >>> value = 80
    >>> f'The value is {value}.'
    'The value is 80.'
    • Es mucho más agradable para permitir que los tipos a aplicar sus propias __format__. Por ejemplo, format(Decimal('0.1'), '.20f') vs '%.20f' % Decimal('0.1'). El último convierte el número Decimal a un flotador.
    • NB. No me sostienen que el viejo estilo es mejor en todos los aspectos – sólo que es más corto, y a veces más legible (y a veces no). Ciertamente, el nuevo método es mucho más flexible.
    • Hay un equivalente para f en Python 3?
    • El f-strings como las utilizadas anteriormente son nueva característica en el lenguaje como Python 3.6. No existe en versiones anteriores y se genera un Error de Sintaxis en los.
  4. 20

    Guido la última posición en esta parece ser los que se indican aquí:

    ¿Qué hay de Nuevo En Python 3.0

    PEP 3101: UN Nuevo Enfoque Para el Formato de Cadena

    Un nuevo sistema para la incorporada en el formato de cadena de operaciones reemplaza
    el % de formato de cadena de operador. (Sin embargo, el operador % es todavía
    admiten, será desaprobado en Python 3.1 y eliminado de la
    idioma en algún momento posterior). Leer PEP 3101 por la primicia total.

    Y la PEP3101 sí mismo, que tiene la última modificación data (Viernes, 30 de septiembre de 2011), así que no hay progreso como de tarde, supongo.

  5. 18

    Mirando a los mayores de Python docs y PEP 3101, hay una declaración de que el operador % serán desaprobados y retirados de la lengua en el futuro. El siguiente declaración fue en Python docs para Python 3.0, 3.1 y 3.2:

    Desde str.format() es bastante nuevo, un montón de código en Python utiliza todavía el %
    operador. Sin embargo, debido a que este viejo estilo de formato
    finalmente se retira de la lengua, str.formato (por lo general debe
    ser utilizado.

    Si usted va a la misma sección en Python 3.3 y 3.4 docs, usted verá que la declaración ha sido eliminado. No puedo encontrar ninguna otra declaración en cualquier otro lugar en la documentación que indica que el operador será obsoleto o quitado de la lengua. También es importante tener en cuenta que PEP3101 no se ha modificado en más de dos años y medio (Viernes, 30 de septiembre de 2011).

    Actualización

    PEP461 Añadiendo % formato de bytes y bytearray es aceptado y debe ser parte de Python 3.5 o 3.6. Es otra señal de que el operador % está vivito y coleando.

Dejar respuesta

Please enter your comment!
Please enter your name here