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?

Foi útil?

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:

-O

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

PYTHONOPTIMIZE

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top