Disable assertions en Python

comment désactiver les assertions en Python?

C'est-à-dire, si une affirmation échoue, Je ne veux pas qu'elle lance un AssertionError , mais qu'elle continue.

comment je fais ça?

53
demandé sur Aaron Hall 2009-08-13 20:49:37

6 réponses

comment désactiver les assertions en Python?

il y a plusieurs approches qui affectent un seul processus, l'environnement, ou une seule ligne de code.

je montre chacun.

pour l'ensemble du procédé

utilisant le drapeau -O (capital O) désactive toutes les affirmations d'assertion dans un processus.

par exemple:

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

pour l'environnement

Vous pouvez utiliser une variable d'environnement pour définir cet indicateur.

cela affectera tous les processus qui utilisent ou héritent l'environnement.

E. G., dans Windows, Définir puis effacer la variable d'environnement:

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
C:\>SET PYTHONOPTIMIZE=TRUE

C:\>python -c "assert False"

C:\>SET PYTHONOPTIMIZE=

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

idem dans Unix (en utilisant set et unset pour les fonctionnalités respectives)

Seul point dans le code

vous continuez votre question:

si une affirmation échoue, Je ne veux pas qu'elle lance une erreur D'affirmation, mais qu'elle continue.

si vous voulez le code qui ne peut pas être exercé, vous pouvez attraper une erreur d'assertion:

>>> try:
...     assert False, "we know this fails"
... except AssertionError as e:
...     print(repr(e))
...
AssertionError('we know this fails',)

et vous continuerez à partir du point où vous avez manipulé le AssertionError .

Références

à Partir de le assert documentation :

une affirmation comme celle-ci:

assert expression #, optional_message

est équivalent à

if __debug__:
    if not expression: raise AssertionError #(optional_message)

et,

la variable intégrée __debug__ est True dans des circonstances normales, False lorsque l'optimisation est demandée (option de ligne de commande -O ).

de l'usage docs:

-O

activez les optimisations de base. Cela modifie l'extension du nom de fichier pour les fichiers compilés (bytecode).pyc .pyo. Voir aussi PYTHONOPTIMIZE.

et

PYTHONOPTIMIZE

S'il s'agit d'une chaîne non vide, c'est équivalent à la spécification de l'option -O . Si défini à un entier, il est équivalent à spécifiant -O plusieurs fois.

24
répondu Aaron Hall 2017-05-23 12:03:03

appelez Python avec le drapeau-O:

test.py:

assert(False)
print 'Done'

sortie:

C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    assert(False)
AssertionError

C:\temp\py>C:\Python26\python.exe -O test.py
Done
54
répondu Mark Rushakoff 2009-08-13 16:53:41

les deux réponses déjà données sont valides (appelez Python avec -O ou -OO sur la ligne de commande).

Voici la différence entre eux:

  • -O activez les optimisations de base. Cela modifie l'extension filename pour les fichiers compilés (bytecode) à partir de .pyc .pyo.

  • -OO jeter docstrings en plus aux optimisations -O .

(De la la documentation Python )

12
répondu Michael Currie 2015-09-12 06:07:36

utiliser python -O :

$ python -O
>>> assert False
>>> 
7
répondu John Millikin 2009-08-13 16:52:12

Vous devriez PAS désactiver (la plupart) des assertions. Ils captent des erreurs imprévues lorsque l'attention est ailleurs. Voir la règle 5 dans " le pouvoir des dix " .

au lieu de cela, garder certains contrôles d'assertion coûteux par quelque chose comme:

import logging
logger = logging.getLogger(__name__)

if logger.getEffectiveLevel() < logging.DEBUG:
    ok = check_expensive_property()
    assert ok, 'Run !'

une façon de conserver les assertions importantes et de permettre l'optimisation des déclarations assert est de les soulever dans une déclaration de sélection:

if foo_is_broken():
    raise AssertionError('Foo is broken!')
3
répondu Ioannis Filippidis 2017-09-29 08:32:30

L'exécution en mode optimisé devrait le faire:

python -OO module.py
2
répondu FogleBird 2017-02-09 18:18:28