Question Quelle est l'utilisation de "assert" en Python?


J'ai lu un certain code source et à plusieurs endroits j'ai vu l'utilisation de assert.

Qu'est-ce que cela signifie exactement? Quel est son usage?


599
2018-02-28 13:11


origine


Réponses:


le assert déclaration existe dans presque tous les langages de programmation. Quand tu fais ...

assert condition

... vous dites au programme de tester cette condition, et déclenchez une erreur si la condition est fausse.

En Python, c'est à peu près équivalent à ceci:

if not condition:
    raise AssertionError()

Essayez-le dans le shell Python:

>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Les assertions peuvent inclure un message facultatif et vous pouvez les désactiver lors de l'exécution de l'interpréteur.

Pour imprimer un message si l'assertion échoue:

assert False, "Oh no! This assertion failed!"

En cours d'exécution python en mode optimisé, où __debug__ est False, les affirmations seront ignorées. Il suffit de passer le -O drapeau:

python -O script.py

Voir ici pour la documentation pertinente.


684
2018-02-28 13:15



Attention aux parenthèses. Comme cela a été souligné ci-dessus, en Python 3, assert est toujours une déclaration, donc par analogie avec print(..), on peut extrapoler la même chose assert(..) ou raise(..) mais tu ne devrais pas.

C'est important parce que:

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

ne fonctionnera pas, contrairement à

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

La raison pour laquelle le premier ne fonctionnera pas est que bool( (False, "Houston we've got a problem") ) évalue à True.

Dans la déclaration assert(False), ce ne sont que des parenthèses redondantes False, qui évaluent à leur contenu. Mais avec assert(False,) les parenthèses sont maintenant un tuple, et un tuple non vide évalue à True dans un contexte booléen.


303
2018-06-11 02:15



Comme d'autres réponses l'ont noté, assert est similaire au lancement d'une exception si une condition donnée n'est pas vraie. Une différence importante est que les instructions assert sont ignorées si vous compilez votre code avec l'option d'optimisation. le Documentation dit ça assert expression peut mieux être décrit comme étant équivalent à

if __debug__:
   if not expression: raise AssertionError

Cela peut être utile si vous voulez tester votre code de manière approfondie, puis publier une version optimisée lorsque vous êtes satisfait qu'aucun de vos cas d'assertion échoue - lorsque l'optimisation est activée, le __debug__ La variable devient Faux et les conditions cesseront d'être évaluées. Cette fonctionnalité peut également vous sortir si vous comptez sur les affirmations et ne réalisez pas qu'elles ont disparu.


100
2018-02-28 14:10



D'autres vous ont déjà donné des liens vers la documentation.

Vous pouvez essayer ce qui suit dans un shell interactif:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

La première déclaration ne fait rien, tandis que la seconde soulève une exception. C'est le premier indice: les assertions sont utiles pour vérifier les conditions qui devraient être vraies dans une position donnée de votre code (généralement, le début (conditions préalables) et la fin d'une fonction (postconditions)).

Les assertions sont en fait fortement liées à la programmation par contrat, ce qui est une pratique d'ingénierie très utile:

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


42
2018-02-28 13:18



Le but d'une assertion en Python est d'informer les développeurs irrécupérable erreurs dans un programme.

Les assertions ne sont pas destinées à signaler les conditions d'erreur attendues, comme "fichier non trouvé", où un utilisateur peut prendre des mesures correctives (ou réessayer).

Une autre façon de voir est de dire que les assertions sont autocontrôles internes dans votre code. Ils travaillent en déclarant certaines conditions comme impossible dans votre code. Si ces conditions ne tiennent pas, cela signifie qu'il y a un bug dans le programme.

Si votre programme est sans bug, ces conditions ne se produiront jamais. Mais si l'un d'eux Est-ce que le programme va se bloquer avec une erreur d'assertion vous indiquant exactement quelle condition "impossible" a été déclenchée. Cela rend beaucoup plus facile de traquer et de corriger les bogues dans vos programmes.

Voici un résumé de un tutoriel sur les affirmations de Python J'ai écrit:

L'instruction assert de Python est une aide au débogage et non un mécanisme de gestion des erreurs d'exécution. L'objectif de l'utilisation des assertions est de permettre aux développeurs de trouver plus rapidement la cause première probable d'un bogue. Une erreur d'assertion ne doit jamais être déclenchée sauf s'il y a un bug dans votre programme.


23
2018-01-18 14:04



L'affirmation assert a deux formes.

La forme simple, assert <expression>, est équivalent à

if __​debug__:
    if not <expression>: raise AssertionError

La forme étendue, assert <expression1>, <expression2>, est équivalent à

if __​debug__:
    if not <expression1>: raise AssertionError, <expression2>

15
2017-07-10 01:21



Les assertions sont un moyen systématique de vérifier que l'état interne d'un programme est celui attendu par le programmeur, dans le but d'intercepter les bogues. Voir l'exemple ci-dessous.

>>> 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 docs:

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

Ici vous pouvez lire plus: http://docs.python.org/release/2.5.2/ref/assert.html


11
2018-02-28 13:16



Voici un exemple simple, enregistrez ceci dans le fichier (disons b.py)

def chkassert(num):
    assert type(num) == int


chkassert('a')

et le résultat quand $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 déclaration après assert est vraie alors le programme continue, mais si l'instruction après assert est fausse alors le programme donne une erreur. Aussi simple que cela.

par exemple.:

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 vous voulez savoir exactement ce qu'une fonction réservée fait en python, tapez help(enter_keyword)

Assurez-vous que si vous entrez un mot clé réservé que vous entrez en tant que chaîne.


3
2017-07-16 03:51