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?

È stato utile?

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

la documentazione assert :

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:

  

-O

     

Accendere ottimizzazioni di base. Questo cambia l'estensione del file per file compilati (bytecode) da .pyc a .pyo. Vedi anche PYTHONOPTIMIZE.

e

  

PYTHONOPTIMIZE

     

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top