sirve - unittest python 3
¿Cuál es el uso de "afirmar" en Python? (17)
He estado leyendo algún código fuente y en varios lugares he visto el uso de assert
.
¿Qué significa exactamente? ¿Cuál es su uso?
Aquí hay un ejemplo simple, guárdelo en un archivo (digamos b.py)
def chkassert(num):
assert type(num) == int
chkassert(''a'')
y el resultado cuando $python b.py
Traceback (most recent call last):
File "b.py", line 5, in <module>
chkassert(''a'')
File "b.py", line 2, in chkassert
assert type(num) == int
AssertionError
Básicamente, el significado de la palabra clave assert es que si la condición no es verdadera, entonces, a través de un error de aserción, continuará, por ejemplo, en Python.
código-1
a=5
b=6
assert a==b
SALIDA:
assert a==b
AssertionError
código-2
a=5
b=5
assert a==b
SALIDA:
Process finished with exit code 0
Como han señalado otras respuestas, assert
es similar a lanzar una excepción si una condición dada no es verdadera. Una diferencia importante es que las declaraciones de afirmación se ignoran si compila su código con la opción de optimización. La documentation dice que assert expression
puede describirse mejor como equivalente a
if __debug__:
if not expression: raise AssertionError
Esto puede ser útil si desea probar minuciosamente su código, luego libere una versión optimizada cuando esté satisfecho de que ninguno de sus casos de afirmación falle: cuando la optimización está __debug__
, la variable __debug__
convierte en False y las condiciones dejarán de ser evaluadas. Esta función también puede atraparlo si confía en las afirmaciones y no se da cuenta de que han desaparecido.
Cuidado con los paréntesis. Como se ha señalado anteriormente, en Python 3, assert
sigue siendo una afirmación , por lo que, por analogía con la print(..)
, se puede extrapolar lo mismo para assert(..)
o raise(..)
pero no debería.
Esto es importante porque:
assert(2 + 2 == 5, "Houston we''ve got a problem")
no funcionará, a diferencia de
assert 2 + 2 == 5, "Houston we''ve got a problem"
La razón por la que la primera no funcionará es que bool( (False, "Houston we''ve got a problem") )
evalúa como True
.
En la afirmación de afirmación assert(False)
, estos son solo paréntesis redundantes alrededor de False
, que evalúan sus contenidos. Pero con assert(False,)
los paréntesis son ahora una tupla, y una tupla no vacía se evalúa como True
en un contexto booleano.
De docs:
Assert statements are a convenient way to insert debugging assertions into a program
Aquí puede leer más: docs.python.org/release/2.5.2/ref/assert.html
El objetivo de una afirmación en Python es informar a los desarrolladores sobre errores irrecuperables en un programa.
Las afirmaciones no pretenden señalar las condiciones de error esperadas, como "archivo no encontrado", donde un usuario puede tomar medidas correctivas (o simplemente intentarlo de nuevo).
Otra forma de verlo es decir que las afirmaciones son autocomprobaciones internas en su código. Funcionan declarando algunas condiciones como imposibles en tu código. Si estas condiciones no se cumplen, significa que hay un error en el programa.
Si su programa está libre de errores, estas condiciones nunca ocurrirán. Pero si ocurre uno de ellos , el programa se bloqueará con un error de confirmación que le indicará exactamente qué condición "imposible" se activó. Esto hace que sea mucho más fácil rastrear y corregir errores en sus programas.
Aquí hay un resumen de un tutorial sobre las aserciones de Python que escribí:
La declaración de afirmación de Python es una ayuda de depuración, no un mecanismo para manejar errores en tiempo de ejecución. El objetivo de usar aserciones es permitir que los desarrolladores encuentren la causa raíz probable de un error más rápidamente. Nunca se debe generar un error de aserción a menos que haya un error en su programa.
La aseveración tiene dos formas.
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>
La declaración de afirmación existe en casi todos los lenguajes de programación. Ayuda a detectar problemas al principio de su programa, donde la causa es clara, y no más tarde como un efecto secundario de alguna otra operación.
Cuando tu lo hagas...
assert condition
... le está diciendo al programa que pruebe esa condición, e inmediatamente active un error si la condición es falsa.
En Python, es aproximadamente equivalente a esto:
if not condition:
raise AssertionError()
Pruébalo en el shell de Python:
>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
Las aserciones pueden incluir un mensaje opcional y puede deshabilitarlas al ejecutar el intérprete.
Para imprimir un mensaje si la aserción falla:
assert False, "Oh no! This assertion failed!"
Cuando se ejecuta python
en modo optimizado, donde __debug__
es False
, las declaraciones de afirmación se ignorarán. Simplemente pase la bandera -O
:
python -O script.py
Vea here la documentación relevante.
Las afirmaciones son una forma sistemática de verificar que el estado interno de un programa es el esperado por el programador, con el objetivo de detectar errores. Vea el ejemplo a continuación.
>>> number = input(''Enter a positive number:'')
Enter a positive number:-1
>>> assert (number > 0), ''Only positive numbers are allowed!''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
Mi breve explicación es:
-
assert
elevaAssertionError
si la expresión es falsa, de lo contrario simplemente continúa con el código, y si hay una coma cualquiera seaAssertionError: whatever after comma
, y para el código es como:raise AssertionError(whatever after comma)
Un tutorial relacionado sobre esto:
https://www.tutorialspoint.com/python/assertions_in_python.htm
Otros ya te han dado enlaces a documentación.
Puedes probar lo siguiente en una shell interactiva:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
La primera declaración no hace nada, mientras que la segunda plantea una excepción. Esta es la primera sugerencia: las afirmaciones son útiles para verificar las condiciones que deben cumplirse en una posición determinada de su código (generalmente, el principio (condiciones previas) y el final de una función (postcondiciones)).
Las afirmaciones en realidad están altamente ligadas a la programación por contrato, lo que es una práctica de ingeniería muy útil:
Python assert es básicamente una ayuda de depuración que prueba la condición de autocomprobación interna de su código. Assert hace que la depuración sea realmente fácil cuando su código entra en casos de borde imposible. Afirmar comprobar esos casos imposibles.
Digamos que hay una función para calcular el precio del artículo después del descuento:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
aquí, discounted_price nunca puede ser menor que 0 y mayor que el precio real. Por lo tanto, en caso de que se viole la condición anterior, asert genera un error de aserción, lo que ayuda al desarrollador a identificar que algo imposible había ocurrido.
Espero eso ayude :)
Si alguna vez desea saber exactamente qué hace una función reservada en python, escriba help(enter_keyword)
Asegúrese de que, si ingresa una palabra clave reservada, la ingrese como una cadena.
formato: afirmar Expresión [, argumentos] Cuando assert encuentra una declaración, Python evalúa la expresión. Si la declaración no es verdadera, se genera una excepción (assertionError). Si la aserción falla, Python usa ArgumentExpression como el argumento para AssertionError. Las excepciones de AssertionError se pueden capturar y manejar como cualquier otra excepción usando la declaración try-except, pero si no se manejan, terminarán el programa y producirán un rastreo. Ejemplo:
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
Cuando se ejecuta el código anterior, produce el siguiente resultado:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
si la declaración después de afirmar es verdadera, entonces el programa continúa, pero si la declaración después de afirmar es falsa, entonces el programa da un error. Simple como eso.
p.ej:
assert 1>0 #normal execution
assert 0>1 #Traceback (most recent call last):
#File "<pyshell#11>", line 1, in <module>
#assert 0>1
#AssertionError
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)
>>> #first we try without assert
>>>if test_us == True:
print("YES! I am right!")
else:
print("I am Wrong, but the program still RUNS!")
I am Wrong, but the program still RUNS!
>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
assert test_us
AssertionError
>>>
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
Puede utilizarse para garantizar que los parámetros se pasan en la llamada de función.