afirmações Desativar em Python
-
13-09-2019 - |
Pergunta
Como faço para desativar afirmações em Python?
Isto é, se uma afirmação falhar, eu não quero que ele jogue um AssertionError
, mas para continuar.
Como posso fazer isso?
Solução
Como faço para desativar afirmações em Python?
Existem várias abordagens que afetam um único processo, o ambiente, ou uma única linha de código.
I demonstram cada um.
Para todo o processo
Usando a bandeira -O
(O Capital) desativa todas as instruções Assert em um processo.
Por exemplo:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
Note que, ao desativar quero dizer que também não executa a expressão que se 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
Para o meio ambiente
Você pode usar uma variável de ambiente para definir essa bandeira também.
Isso vai afetar todos os processos que utilizem ou herda o ambiente.
por exemplo, no Windows, configuração e, em seguida, limpar a variável de 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
Mesmo em Unix (usando set e unset para a respectiva funcionalidade)
Único ponto em código
Você continua sua pergunta:
Se uma afirmação falhar, eu não quero que ele jogue um AssertionError, mas para continuar.
Se você deseja que o código que deixa de ser exercida, você pode pegar quer garantir o fluxo de controle não atinge a afirmação, por exemplo:
if False:
assert False, "we know this fails, but we don't get here"
ou você pode pegar o erro de declaração:
try:
assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
print(repr(e))
que impressões:
AssertionError('this code runs, fails, and the exception is caught')
e você vai continuar a partir do ponto que você lidou com a AssertionError
.
Referências
A partir a documentação assert
:
Uma instrução assert assim:
assert expression #, optional_message
É equivalente a
if __debug__: if not expression: raise AssertionError #(optional_message)
E,
o built-in
__debug__
variável éTrue
em circunstâncias normais,False
quando a otimização é solicitado (comando opção de linha de-O
).
e mais
Atribuições a
__debug__
são ilegais. O valor para a variável interna é determinada quando o interpretador é iniciado.
De docs de uso:
Ativar otimizações básicas. Isso muda a extensão do arquivo para arquivos compilados (bytecode) de .pyc para .pyo. Veja também PYTHONOPTIMIZE.
e
Se isso for definido como uma string não-vazia é equivalente a especificar a opção
-O
. Se for definido como um número inteiro, é equivalente a especificando-O
várias vezes.
Outras dicas
Chamada Python com a bandeira -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
Ambos as duas respostas já dadas são válidos (chamada Python com qualquer -O
ou -OO
na linha de comando).
Aqui está a diferença entre eles:
-
Ligue
-O
em otimizações básicas. Isso muda a extensão de arquivo para arquivos compilados (bytecode) de .pyc para .pyo. -
-OO
Descartar docstrings além para as otimizações-O
.
(Do Python documentação )
Use python -O
:
$ python -O
>>> assert False
>>>
Você deve não Desativar (a maioria) afirmações. Eles detectar erros inesperados quando a atenção está em outro lugar. Ver Regra 5 em "A potência de dez" .
Em vez disso, guarde algumas verificações de asserção caro por algo como:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
Uma forma de manter afirmações importantes, e permitir declarações assert
ser otimizado distância é por criá-los dentro de uma instrução de seleção:
if foo_is_broken():
raise AssertionError('Foo is broken!')
Em execução no modo otimizado deve fazê-lo:
python -OO module.py