multiple examples characters python string-formatting

examples - python format string multiple arguments



Error de formato de texto: no se permite la alineaciĆ³n ''='' en el especificador de formato de cadena (5)

¿Qué significa ''='' alignment en el siguiente mensaje de error y por qué lo causa este código?

>>> "{num:03}".format(num="1") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: ''='' alignment not allowed in string format specifier

El código tiene un problema sutil: el valor de entrada "1" es texto, no un número. Pero el mensaje de error no parece tener nada que ver con eso.

No hay nada en el mensaje de error que indique por qué “''='' alineación” es relevante y no aparece en el código. Entonces, ¿cuál es el significado de emitir ese mensaje de error?


El mensaje de error aparece porque el especificador de formato ha implícito la ''='' alignment .

El str.format mini-lenguaje de la especificación de formato str.format ha decidido el especificador de alineación "=" porque:

Si se precede el campo de ancho con un carácter cero (''0''), se habilita el relleno cero para los tipos numéricos. Esto es equivalente a un carácter de relleno de ''0'' con un tipo de alineación de ''=''.

Por lo tanto, al especificar 0N como "cero relleno a N ancho", ha implicado que "la entrada es de tipo numérico" y "los ceros deben ir entre el signo y los dígitos". Esta última implicación es lo que se entiende por ''='' alignment .

Como el valor "1" no es numérico, el código de manejo de alineación "=" genera esa excepción. El mensaje está escrito esperando que sepa de qué se está hablando porque solicitó (por implicación) la alineación "=".

Sí, creo que ese mensaje de error necesita ser mejorado. He planteado un problema para eso .


Está intentando insertar ''string -> "1" donde se requiere un float-> 3.44. Elimine las comillas "1", es decir, num = 1, y funcionará


Este formato sería aceptable.

"{num}:03".format(num="1")

pero la forma en que ha especificado el marcador de posición {num:03} no lo es. Sin embargo, ese es un ValueError interesante, si elimina el : el error interesante es reemplazado por un KeyError estándar.


Una solución es utilizar ''>'' relleno ''>'' (justificación derecha), que es con la sintaxis:

[[fill]align][width]

con alinear ser > y llenar siendo 0 .

Rellene los valores predeterminados al espacio .

>>> "{num:0>3}".format(num="1") ''001''

El problema fue que alinear los valores por defecto a = que significa

Hace que el relleno se coloque después de la señal (si existe) pero antes de los dígitos. Esto se utiliza para imprimir campos en el formulario ''+000000120''. Esta opción de alineación solo es válida para los tipos numéricos. Se convierte en el valor predeterminado cuando ''0'' precede inmediatamente al ancho del campo.

Fuente (documentos de Python 3)

No hay ningún signo en la cadena. También puede especificar la alineación manualmente y usar la sintaxis:

[align]0[width]

>>> "{num:>03}".format(num="1") ''001''

También tenga en cuenta:

>>> "{num:^03} {num:<03}".format(num="1") ''010 100''

que funciona con la misma lógica pero para alinear se deja justificar a la izquierda ( < ) y centrar ( ^ )


str.__format__ no sabe qué hacer con su parte 03 . Eso solo funciona con números:

>>> "{num:03}".format(num=1) ''001''

Si realmente quieres poner a cero una cadena, puedes usar rjust :

>>> "1".rjust(3, "0") ''001''