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.