with what stdlib python assert parentheses

python - what - pitón afirma con y sin paréntesis



stdlib python (5)

Aquí hay cuatro simples invocaciones de assert:

>>> assert 1==2 Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError >>> assert 1==2, "hi" Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError: hi >>> assert(1==2) Traceback (most recent call last): File "<stdin>", line 1, in ? AssertionError >>> assert(1==2, "hi")

Tenga en cuenta que el último no genera un error. ¿Cuál es la diferencia entre llamar afirmar con o sin paréntesis que causa este comportamiento? Mi práctica es usar paréntesis, pero lo anterior sugiere que no debería.


A continuación se cita del documento python

Las declaraciones de confirmación son una forma conveniente de insertar las aserciones de depuración en un programa:

assert_stmt ::= "assert" expression ["," expression]

La forma simple, assert expression, es equivalente a if __debug__: if not expression: raise AssertionError

La forma extendida, assert expression1, expression2 , es equivalente a if __debug__: if not expression1: raise AssertionError(expression2)

Entonces, cuando usa paréntesis aquí, está usando la forma simple, y la expresión se evalúa como una tupla, que siempre es verdadera cuando se la envía a bool


La última SyntaxWarning: assertion is always true, perhaps remove parentheses? le habría dado una advertencia ( SyntaxWarning: assertion is always true, perhaps remove parentheses? ) Si la ejecutó a través de un intérprete completo, no a través de IDLE. Como assert es una palabra clave y no una función, en realidad está pasando una tupla como primer argumento y dejando fuera el segundo argumento.

Recuerde que las tuplas no vacías se evalúan como True , y dado que el mensaje de afirmación es opcional, básicamente ha llamado assert True cuando escribió assert(1==2, "hi") .


Puede romper la declaración de afirmación sin / como esta:

foo = 7 assert foo == 8, ( ''derp should be 8, it is '' + str(foo))

O si tienes un mensaje aún más largo:

foo = 7 assert foo == 8, ( ''Lorem Ipsum is simply dummy text of the printing and typesetting '' ''industry. Lorem Ipsum has been the industry/'s standard dummy text '' ''ever since the 1500s'' )


Si coloca el paréntesis allí porque quería una afirmación de varias líneas, entonces una alternativa es poner una barra invertida al final de la línea como esta:

foo = 7 assert foo == 8, / "derp should be 8, it is " + str(foo)

Prints: AssertionError: "derp debe ser 8, es 7


assert 1==2, "hi" se analiza como assert 1==2, "hi" con "hola" como el segundo parámetro para la palabra clave. Por lo tanto, por qué da correctamente un error.

assert(1==2) se analiza como assert (1==2) que es idéntico para assert 1==2 , porque los parens alrededor de un único elemento no crean una tupla a menos que haya una coma final, por ejemplo (1==2,) .

assert(1==2, "hi") se analiza como assert (1==2, "hi") , lo que no da error porque una tupla no vacía (False, "hi") no es una valor falso, y no hay un segundo parámetro proporcionado a la palabra clave.

No debe usar paréntesis porque assert no es una función en Python, es una palabra clave.