¿Para qué sirve la función global format ()?

Existe el método str.format() en python con el que estoy familiarizado, pero no funciona de la misma manera que la función format() (global-builtin).

¿Cuál es el propósito de la función format() global?

La función format() formatea un valor de acuerdo con una especificación de formato.

El método str.format() analiza una plantilla y luego formatea los valores individuales. Cada {value_reference:format_spec} se aplica básicamente al valor coincidente utilizando la función format() , como format(referenced_value, format_spec) .

En otras palabras, str.format() está construido sobre la función format() . str.format() opera en una cadena de syntax de cadena de format() , format() opera en los valores coincidentes y aplica solo el mini-lenguaje de especificación de formato .

Por ejemplo, en la expresión

 'The hex value of {0:d} is {0:02x}'.format(42) 

la cadena de plantilla tiene dos ranuras de plantilla, ambas formatean el mismo argumento al método str.format() . El primero interpola la salida del format(42, 'd') , el otro format(42, '02x') . Tenga en cuenta que el segundo argumento en ambos casos es el especificador de formato, por ejemplo, todo lo que viene después de : dos puntos en el marcador de posición de la plantilla.

Use la función format() cuando desee formatear un solo valor, use str.format() cuando quiera colocar ese valor formateado en una cadena más grande.

Bajo el capó, format() delega en el método object.__format__ del object.__format__ para permitir que el valor mismo interprete la especificación de formato. str.format() llama a ese método directamente, pero no debe confiar en esto . object.__format__ es un gancho, en el futuro el format() puede aplicar más procesamiento al resultado de ese gancho, o preprocesar el formato para pasar. Todo esto es realmente un detalle de implementación, solo interesante si desea implementar su propio Lenguaje de formato para su tipo de objeto.

Consulte PEP-3101 Formato de cadena avanzado para ver la propuesta original que agregó str.format() , format() y el object.__format__ enganchan al idioma.

Para agregar a la respuesta de Martin, eche un vistazo a la propuesta PEP3101:

Cada tipo de Python puede controlar el formato de sus instancias definiendo un método __format__ . El método __format__ es responsable de interpretar el especificador de formato, formatear el valor y devolver la cadena resultante.

La nueva función integrada global ‘formato’ simplemente llama a este método especial, similar a cómo len() y str() simplemente llaman a sus respectivos métodos especiales:

 def format(value, format_spec): return value.__format__(format_spec) 

Es seguro llamar a esta función con un valor de “Ninguno” (porque el valor de “Ninguno” en Python es un objeto y puede tener métodos).

Varios tipos incorporados, incluidos ‘str’, ‘int’, ‘float’ y ‘object’ definen los métodos __format__ . Esto significa que si se deriva de cualquiera de esos tipos, su clase sabrá cómo formatearse.

Más información aquí .

El método str.format () y la clase Formatter comparten la misma syntax para las cadenas de formato (aunque en el caso de Formatter, las subclases pueden definir su propia syntax de cadena de formato).

Las cadenas de formato contienen “campos de reemplazo” rodeados por llaves {}. Cualquier cosa que no esté contenida entre llaves se considera texto literal, que se copia sin cambios a la salida. Si necesita incluir un carácter de refuerzo en el texto literal, se puede escapar duplicando: {{y}}.

La gramática para un campo de reemplazo es la siguiente:

 replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" field_name ::= arg_name ("." attribute_name | "[" element_index "]")* arg_name ::= [identifier | integer] attribute_name ::= identifier element_index ::= integer | index_string index_string ::=  + conversion ::= "r" | "s" format_spec ::=  

Vea también la sección Mini-Idioma de Especificación de Formato.

El nombre de campo en sí mismo comienza con un nombre de arg que es un número o una palabra clave. Si es un número, se refiere a un argumento posicional, y si es una palabra clave, se refiere a un argumento de palabra clave con nombre. Si los nombres de argumentos numéricos en una cadena de formato son 0, 1, 2, … en secuencia, todos se pueden omitir (no solo algunos) y los números 0, 1, 2, … se insertarán automáticamente en ese orden . Debido a que arg_name no está delimitado por comillas, no es posible especificar claves de diccionario arbitrarias (por ejemplo, las cadenas ’10’ o ‘: -]’) dentro de una cadena de formato. El nombre_arg puede ir seguido de cualquier número de expresiones de índice o atributo. Una expresión de la forma ‘.name’ selecciona el atributo nombrado usando getattr (), mientras que una expresión de la forma ‘[index]’ hace una búsqueda de índice usando getitem ().

Modificado en la versión 2.7: los especificadores de argumento posicionales pueden omitirse, por lo que ‘{} {}’ es equivalente a ‘{0} {1}’.

Como se menciona en la documentación de Python