Jak wyłączyć asercje w Pythonie?
Oznacza to, że jeśli twierdzenie zawiedzie, nie chcę, aby rzucało AssertionError
, ale kontynuowało.
Jak mogę to zrobić?
Odpowiedzi:
Jak wyłączyć asercje w Pythonie?
Istnieje wiele podejść, które mają wpływ na pojedynczy proces, środowisko lub pojedynczą linię kodu.
Demonstruję każdego.
Użycie -O
flagi (duże O) wyłącza wszystkie instrukcje assert w procesie.
Na przykład:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
Zauważ, że wyłączając mam na myśli, że nie wykonuje również następującego wyrażenia:
$ 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
Możesz również użyć zmiennej środowiskowej, aby ustawić tę flagę.
Wpłynie to na każdy proces, który wykorzystuje lub dziedziczy środowisko.
Np. W systemie Windows ustawienie, a następnie wyczyszczenie zmiennej środowiskowej:
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
To samo w systemie Unix (używanie set i unset dla odpowiednich funkcji)
Kontynuuj swoje pytanie:
jeśli asercja się nie powiedzie, nie chcę, aby wyrzucała AssertionError, ale kontynuowała.
Jeśli chcesz, aby kod, którego nie udało się wykonać, możesz złapać albo upewnić się, że przepływ sterowania nie dociera do potwierdzenia, na przykład:
if False:
assert False, "we know this fails, but we don't get here"
lub możesz złapać błąd asercji:
try:
assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
print(repr(e))
który drukuje:
AssertionError('this code runs, fails, and the exception is caught')
i będziesz kontynuować od momentu, w którym zajmowałeś się AssertionError
.
Oświadczenie asertujące, takie jak to:
assert expression #, optional_message
Jest równa
if __debug__:
if not expression: raise AssertionError #(optional_message)
I,
zmienna wbudowana
__debug__
występujeTrue
w normalnych okolicznościach,False
gdy żądana jest optymalizacja (opcja wiersza poleceń-O
).
i dalej
Przydziały do
__debug__
są nielegalne. Wartość zmiennej wbudowanej jest określana podczas uruchamiania interpretera.
Z dokumentacji użytkowania:
Włącz podstawowe optymalizacje. Zmienia to rozszerzenie nazwy pliku skompilowanych (kod bajtowy) z .pyc na .pyo. Zobacz także PYTHONOPTIMIZE.
i
Jeśli jest ustawiony na niepusty łańcuch, jest to równoważne określeniu
-O
opcji. Jeśli jest ustawiona na liczbę całkowitą, jest to równoważne określaniu-O
wielokrotności.
if False: assert False
), Albo możesz złapać błąd Assertion. To są twoje wybory. Zaktualizowałem odpowiedź, aby odpowiedzieć na Twoje pytanie.
foo()
i twierdzenia Wyłączanie: with skip_assertion(): foo()
. Zaletą tego jest to, że nie muszę dodawać kolejnej flagi do funkcji
Assert
obiektów Pass
obiektami). Menedżer kontekstu nie działałby bezpośrednio w tym celu, ale mógłbyś mieć jakiś mechanizm, który używałby dekorowanych funkcji w ten sposób. Mimo wszystko nie polecam tego. Podejrzewam, że powodem, dla którego chcesz to zrobić, jest wywołanie kodu, którego nie kontrolujesz, i pobranie AssertionErrors. Jeśli tak, prawdopodobnie musisz znaleźć inną poprawkę.
Wywołaj Pythona z flagą -O:
test.py:
assert(False)
print 'Done'
Wynik:
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
Obie podane już odpowiedzi są poprawne (wywołaj Pythona z linii poleceń -O
lub -OO
z wiersza poleceń).
Oto różnica między nimi:
-O
Włącz podstawowe optymalizacje. Zmienia to rozszerzenie nazwy pliku skompilowanych (kod bajtowy) z .pyc na .pyo.
-OO
Oprócz-O
optymalizacji należy odrzucić ciągi dokumentacyjne .
(Z dokumentacji Pythona )
Zastosowanie python -O
:
$ python -O
>>> assert False
>>>
NIE powinieneś wyłączać (większości) asercji. Wyłapują nieoczekiwane błędy, gdy uwaga jest gdzie indziej. Zobacz Regułę 5 w rozdziale „Siła dziesięciu” .
Zamiast tego chroń niektóre drogie testy potwierdzeń, wykonując takie czynności jak:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
Jednym ze sposobów zachowania ważnych stwierdzeń i umożliwienia assert
optymalizacji instrukcji jest podniesienie ich w instrukcji selekcji:
if foo_is_broken():
raise AssertionError('Foo is broken!')
__debug__
Fałsz, ale nie jest to dozwolone.