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?
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__
estTrue
dans des circonstances normales,False
lorsque l'optimisation est demandée (option de ligne de commande-O
).
de l'usage docs:
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
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.
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
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 )
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!')
L'exécution en mode optimisé devrait le faire:
python -OO module.py