Disabilitare asserzioni in Python
-
13-09-2019 - |
Domanda
Come faccio a disattivare le asserzioni in Python?
Questo è, se un'asserzione fallisce, io non voglio che gettare un AssertionError
, ma per andare avanti.
Come faccio a farlo?
Soluzione
Come faccio a disattivare le asserzioni in Python?
Ci sono diversi approcci che interessano un singolo processo, l'ambiente, o di una singola riga di codice.
dimostro ciascuno.
Per l'intero processo
Uso della bandiera -O
(O maiuscola) disabilita tutti affermano dichiarazioni in un processo.
Ad esempio:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
Si noti che per disabilitare voglio dire che anche non esegue l'espressione che lo segue:
$ python -Oc "assert 1/0"
$ python -c "assert 1/0"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
Per l'ambiente
È possibile utilizzare una variabile d'ambiente per impostare questo flag pure.
Questo influenzerà ogni processo che utilizza o eredita l'ambiente.
per esempio, in Windows, l'impostazione e quindi deselezionando la variabile d'ambiente:.
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
Lo stesso in Unix (utilizzando set e unset per rispettive funzionalità)
Unico punto in codice
Si continua la tua domanda:
se un'asserzione fallisce, non voglio che gettare un AssertionError, ma per andare avanti.
Se si desidera che il codice che non riesce ad essere esercitata, si può prendere sia garantire il flusso di controllo non raggiunge l'affermazione, per esempio:
if False:
assert False, "we know this fails, but we don't get here"
o si può prendere l'errore di asserzione:
try:
assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
print(repr(e))
che stampa:
AssertionError('this code runs, fails, and the exception is caught')
e ti andare avanti dal punto in cui ha gestito la AssertionError
.
Riferimenti
Una dichiarazione assert in questo modo:
assert expression #, optional_message
è equivalente a
if __debug__: if not expression: raise AssertionError #(optional_message)
E,
il built-in
__debug__
variabile èTrue
in circostanze normali,False
quando viene richiesta l'ottimizzazione (comando opzione della riga di-O
).
e l'ulteriore
Assegnazioni a
__debug__
sono illegali. Il valore per la variabile built-in è determinato quando l'interprete si avvia.
Dalla documentazione di utilizzo:
Accendere ottimizzazioni di base. Questo cambia l'estensione del file per file compilati (bytecode) da .pyc a .pyo. Vedi anche PYTHONOPTIMIZE.
e
Se questo è impostato su una stringa non vuota è equivalente a specificare l'opzione
-O
. Se impostato su un numero intero, è equivalente a specificando-O
più volte.
Altri suggerimenti
Chiama Python con il flag -O:
test.py:
assert(False)
print 'Done'
Output:
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
Entrambe le due risposte già date valgono (chiamare Python sia con -O
o -OO
sulla riga di comando).
Qui è la differenza tra loro:
-
-O
Accendere ottimizzazioni di base. Questo cambia l'estensione del file per i file compilati (bytecode) da .pyc per .pyo. -
-OO
Scarta docstring oltre per le ottimizzazioni-O
.
(Dal documentazione Python )
Usa python -O
:
$ python -O
>>> assert False
>>>
Si dovrebbe non Disattiva (la maggior parte) affermazioni. Catturano gli errori imprevisti quando l'attenzione è altrove. Vedi la regola 5 a "La potenza di dieci" .
Al contrario, la guardia alcuni costosi controlli di asserzione da qualcosa come:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
Un modo per mantenere affermazioni importanti, e consentire le dichiarazioni assert
di ottimizzare via è di loro alzando all'interno di un'istruzione di selezione:
if foo_is_broken():
raise AssertionError('Foo is broken!')
In esecuzione in modalità ottimizzata dovrebbe farlo:
python -OO module.py