Pregunta ¿Para qué sirve "assert" en Python?


He estado leyendo un código fuente y en varios lugares he visto el uso de assert.

¿Qué significa exactamente? ¿Cuál es su uso?


599
2018-02-28 13:11


origen


Respuestas:


los assert declaración existe en casi todos los lenguajes de programación. Cuando tu lo hagas...

assert condition

... le está diciendo al programa que pruebe esa condición y active un error si la condición es falsa.

En Python, es más o menos 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 afirmaciones pueden incluir un mensaje opcional, y puede deshabilitarlas al ejecutar el intérprete.

Para imprimir un mensaje si la afirmació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 serán ignoradas. Solo pasa el -O bandera:

python -O script.py

Ver aquí para la documentación relevante.


684
2018-02-28 13:15



Cuidado con los paréntesis. Como se ha señalado anteriormente, en Python 3, assert sigue siendo una declaración, por analogía con print(..), uno puede extrapolar lo mismo a assert(..) o raise(..) pero no deberías.

Esto es importante porque:

assert(2 + 2 == 5, "Houston we've got a problem")

no funcionará, a diferencia

assert 2 + 2 == 5, "Houston we've got a problem"

La razón por la que el primero no funcionará es que bool( (False, "Houston we've got a problem") ) evalúa a True.

En la declaración assert(False), estos son solo paréntesis redundantes alrededor 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.


303
2018-06-11 02:15



Como otras respuestas han notado, assert es similar a lanzar una excepción si una condición dada no es verdadera. Una diferencia importante es que las sentencias assert se ignoran si compila su código con la opción de optimización. los documentación dice que assert expression puede describirse mejor como equivalente a

if __debug__:
   if not expression: raise AssertionError

Esto puede ser útil si quiere probar su código a fondo, y luego lanzar una versión optimizada cuando esté satisfecho de que ninguno de sus casos de aserción falla; cuando la optimización está activada, el __debug__ la variable se convierte en False y las condiciones dejarán de evaluarse. Esta característica también puede atraparlo si está confiando en las aseveraciones y no se da cuenta de que han desaparecido.


100
2018-02-28 14:10



Otros ya le dieron enlaces a la documentación.

Puede intentar lo siguiente en un shell interactivo:

>>> 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 pista: las afirmaciones son útiles para verificar las condiciones que deberían ser verdaderas en una posición determinada de su código (por lo general, el comienzo (condiciones previas) y el final de una función (condiciones posteriores)).

Las afirmaciones en realidad están muy ligadas a la programación por contrato, que es una práctica de ingeniería muy útil:

http://en.wikipedia.org/wiki/Design_by_contract.


42
2018-02-28 13:18



El objetivo de una afirmación en Python es informar a los desarrolladores sobre irrecuperable errores en un programa.

Las afirmaciones no pretenden señalar condiciones de error esperadas, como "archivo no encontrado", donde un usuario puede tomar medidas correctivas (o simplemente volver a intentarlo).

Otra forma de verlo es decir que las afirmaciones son autoverificaciones internas en tu código Trabajan declarando algunas condiciones como imposible en tu código Si estas condiciones no se mantienen, significa que hay un error en el programa.

Si su programa está libre de errores, estas condiciones nunca ocurrirán. Pero si uno de ellos hace El programa se bloqueará con un error de afirmació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 Escribí:

La sentencia de afirmación de Python es una herramienta 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 plantear un error de aserción a menos que haya un error en su programa.


23
2018-01-18 14:04



La afirmación assert 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>

15
2017-07-10 01:21



Las afirmaciones son una forma sistemática de verificar que el estado interno de un programa sea 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!
>>> 

13
2018-02-19 16:52



De documentos:

Assert statements are a convenient way to insert debugging assertions into a program

Aquí puedes leer más: http://docs.python.org/release/2.5.2/ref/assert.html


11
2018-02-28 13:16



Aquí hay un ejemplo simple, guárdelo en el 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

6
2018-02-17 14:54



si la declaración después de assert es verdadera, entonces el programa continúa, pero si la declaración después de assert 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

4
2017-11-01 05:05



Si alguna vez quiere saber exactamente qué hace una función reservada en python, escriba help(enter_keyword)

Asegúrese de ingresar una palabra clave reservada que ingrese como una cadena.


3
2017-07-16 03:51