Aquí hay cuatro invocaciones simples 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 ningún error. ¿Cuál es la diferencia entre llamar a assert con o sin paréntesis que causa este comportamiento? Mi práctica es usar paréntesis, pero lo anterior sugiere que no debería.
python
assert
parentheses
gaefan
fuente
fuente
Respuestas:
El último
assert
le habría dado una advertencia (SyntaxWarning: assertion is always true, perhaps remove parentheses?
) si lo ejecutó a través de un intérprete completo, no a través de IDLE. Debido a queassert
es una palabra clave y no una función, en realidad está pasando una tupla como primer argumento y omitiendo el segundo argumento.Recuerde que las tuplas no vacías evalúan a
True
, y dado que el mensaje de aserción es opcional, básicamente ha llamadoassert True
cuando escribióassert(1==2, "hi")
.fuente
assert (1==2)
paréntesis alrededor de una sola expresión no crearán una tupla automáticamente; obtendría el mismo comportamiento que el número 4 si lo hicieraassert (1==2,)
. Lo mismo sucedería si lo hiciera enprint ('foo', 'bar')
lugar deprint 'foo', 'bar'
; vería la tupla emitidaassert(test, message)
probablemente sean incorrectas y ciertamente confusas. ¡Sin parens!Si coloca el paréntesis allí porque desea una afirmación de varias líneas, entonces una alternativa es colocar una barra invertida al final de la línea como esta:
Huellas dactilares:
¿Por qué esta pitón
assert
tiene que ser diferente de todo lo demás?Creo que la ideología pitónica es que un programa debe autocorregirse sin tener que preocuparse por la bandera especial para activar afirma. La tentación de desactivar las afirmaciones es demasiado grande y, por lo tanto, está en desuso.
Comparto su molestia de que python
assert
tiene una sintaxis única en relación con todas las demás construcciones de programación de Python, y esta sintaxis ha cambiado una vez más de python2 a python3 y nuevamente ha cambiado de python 3.4 a 3.6. Hacer declaraciones de aserción que no sean compatibles con versiones anteriores de ninguna versión a ninguna otra versión.Es un toque en el hombro que
assert
es un ciudadano de tercera clase, se eliminará por completo en python4, y ciertamente nuevamente en Python 8.1.fuente
assert 1==2, "hi"
se analizaassert 1==2, "hi"
con "hi" como segundo parámetro para la palabra clave. De ahí por qué da correctamente un error.assert(1==2)
se analiza comoassert (1==2)
que es idéntico aassert 1==2
, porque los paréntesis alrededor de un solo elemento no crean una tupla a menos que haya una coma al final, por ejemplo(1==2,)
.assert(1==2, "hi")
se analiza comoassert (1==2, "hi")
, lo que no da un error porque una tupla(False, "hi")
no vacía no es un valor falso y no se proporciona un segundo parámetro a la palabra clave.No debe usar paréntesis porque
assert
no es una función en Python, es una palabra clave.fuente
Puede romper la declaración de aserción sin
\
esto:O si tiene un mensaje aún más largo:
fuente
A continuación se cita del documento de Python
La forma simple, aseverar expresión, es equivalente a
if __debug__: if not expression: raise AssertionError
La forma extendida, aseverar expresión1, expresión2 , 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 True cuando se convierte en bool.
fuente