Qual é o uso de" afirmar " em Python?

tenho lido algum código fonte e em vários locais vi o uso de assert.

O que significa exactamente? Qual é o seu uso?

Author: APerson, 2011-02-28

17 answers

A declaração assert existe em quase todas as linguagens de programação. Quando quiseres...

assert condition

... estás a dizer ao programa para testar essa condição, e despoletar um erro se a condição for falsa.

Em Python, é aproximadamente equivalente a isto:

if not condition:
    raise AssertionError()

Tenta na shell Python:

>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

As afirmações podem incluir uma mensagem opcional, e você pode desactivá-las ao executar o interpretador.

Para imprimir uma mensagem se a afirmação falha:

assert False, "Oh no! This assertion failed!"

Ao executar python no modo optimizado, onde __debug__ é False, as declarações de afirmação serão ignoradas. Basta passar a bandeira -O:

python -O script.py

Veraqui para a documentação relevante.

 726
Author: slezica, 2018-06-21 21:43:19
Cuidado com os parêntesis. Como já foi referido acima, em Python 3, assert ainda é uma declaração , por isso, por analogia com print(..), pode-se extrapolar o mesmo para assert(..) ou raise(..) mas não se deve.

Isto é importante porque:

assert(2 + 2 == 5, "Houston we've got a problem")
Não vai funcionar, ao contrário de
assert 2 + 2 == 5, "Houston we've got a problem"

A razão pela qual o primeiro não vai funcionar é que bool( (False, "Houston we've got a problem") ) avalia a True.

Na declaração assert(False), Estes são apenas parênteses redundantes em torno de False, que avaliam o conteúdo deles. Mas com assert(False,) os parênteses são agora uma tupla, e uma tupla não-vazia avalia True num contexto booleano.

 321
Author: Evgeni Sergeev, 2016-04-06 19:31:31

Como outras respostas observaram, assert é semelhante a abrir uma excepção se uma dada condição não for verdadeira. Uma diferença importante é que afirmar afirmações são ignoradas se você compilar seu código com a opção de otimização. A documentação diz que {[2] } pode ser melhor descrita como sendo equivalente a

if __debug__:
   if not expression: raise AssertionError

Isto pode ser útil se você quiser testar cuidadosamente o seu código, em seguida, libere uma versão otimizada quando você está feliz que nenhum dos seus casos de asserção falhar - quando a otimização está ligada, a variável __debug__ torna-se falsa e as condições deixarão de ser avaliadas. Este recurso também pode te pegar se você está confiando nas afirmações e não percebe que eles desapareceram.

 106
Author: Neil Vass, 2011-02-28 14:10:37

Outros já lhe deram links para documentação.

Pode tentar o seguinte numa linha de comandos interactiva:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:
A primeira afirmação não faz nada, enquanto a segunda levanta uma excepção. Esta é a primeira dica: afirma são úteis para verificar as condições que devem ser verdadeiras em uma determinada posição do seu código (normalmente, o início (pré-condições) e o fim de uma função (pós-condições)). [[2]Asserts are actually highly tied to programming by contract, which is uma prática de engenharia muito útil:

Http://en.wikipedia.org/wiki/Design_by_contract.

 44
Author: Baltasarq, 2017-09-19 18:53:12

O objectivo de uma afirmação em Python é informar os programadores sobre erros irrecuperáveis num programa.

As afirmações não se destinam a sinalizar as condições de erro esperadas, como "ficheiro não encontrado", onde um utilizador pode tomar medidas correctivas (ou apenas tentar de novo).

Outra Maneira de olhar para ele é dizer que as afirmações são auto-verificações internas no seu código. Eles trabalham declarando algumas condições como impossível em seu código. Se estas condições não espera, isso significa que há um erro no programa.

Se o seu programa estiver livre de erros, estas condições nunca irão ocorrer. Mas se um deles {[[10]}ocorrer o programa irá estoirar com um erro de asserção dizendo-lhe exatamente qual condição" impossível " foi disparada. Isso torna muito mais fácil de rastrear e corrigir bugs em seus programas.

Aqui está um resumo de um tutorial sobre as afirmações do Python {[19] } Eu escrevi:

A afirmação do Python é uma depuração ajuda, não um mecanismo para lidar com erros de tempo de execução. O objectivo de usar afirmações é deixar os programadores encontrar a causa raiz provável de um erro mais rapidamente. Um erro de asserção nunca deve ser levantado a menos que haja um bug em seu programa.

 27
Author: dbader, 2017-01-18 14:04:46
A afirmação tem duas formas.

A forma simples, assert <expression>, é equivalente a

if __​debug__:
    if not <expression>: raise AssertionError

A forma estendida, assert <expression1>, <expression2>, é equivalente a

if __​debug__:
    if not <expression1>: raise AssertionError, <expression2>
 16
Author: Bohdan, 2014-10-15 20:54:40
As afirmações são uma forma sistemática de verificar se o estado interno de um programa é como o programador esperava, com o objetivo de capturar bugs. Veja o exemplo abaixo.
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>> 
 13
Author: Jacob Abraham, 2014-02-19 16:58:33

De documentos:

Assert statements are a convenient way to insert debugging assertions into a program
Aqui pode ler mais: http://docs.python.org/release/2.5.2/ref/assert.html
 11
Author: gruszczy, 2011-02-28 13:16:38

Aqui está um exemplo simples, Salve isto em Arquivo (vamos dizer b.py)

def chkassert(num):
    assert type(num) == int


chkassert('a')

E o resultado quando $python b.py

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    chkassert('a')
  File "b.py", line 2, in chkassert
    assert type(num) == int
AssertionError
 6
Author: Gaurav Agarwal, 2014-02-17 14:54:52

Se a declaração após assert for verdadeira, então o programa continua, mas se a declaração após assert for falsa, então o programa dá um erro. Tão simples quanto isso.

Por exemplo:

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError
 4
Author: abe312, 2017-06-29 21:52:05

Se alguma vez quiser saber exactamente o que uma função reservada faz em python, escreva em help(enter_keyword)

Certifique-se de que, se estiver a introduzir uma palavra-chave reservada, a introduza como um texto.

 2
Author: ytpillai, 2016-01-07 03:36:24

Python assert é basicamente uma ajuda de depuração que testa a condição para auto-verificação interna do seu código. Afirmar torna a depuração muito fácil quando o seu código entra em casos extremos impossíveis. Confirmar esses casos impossíveis.

Digamos que existe uma função para calcular o preço do item após desconto:
def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price
Aqui, o preço de desconto nunca pode ser inferior a 0 e superior ao preço real. Assim, no caso de violação da condição acima referida, assevera uma afirmação Erro, que ajuda o desenvolvedor a identificar que algo impossível tinha acontecido. Espero que ajude.
 1
Author: Nitish Chauhan, 2018-04-15 17:13:52
A minha explicação curta é:
  • assert Aumenta AssertionError se a expressão for falsa, caso contrário apenas continua o código, e se houver uma vírgula O que quer que seja, será AssertionError: whatever after comma, e o código é como: raise AssertionError(whatever after comma)

Um tutorial relacionado sobre isto:

Https://www.tutorialspoint.com/python/assertions_in_python.htm

 0
Author: U9-Forward, 2018-09-23 05:55:31
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

Pode ser usado para garantir que os parâmetros são passados na chamada de função.

 -1
Author: user2725012, 2016-02-19 21:00:10

Formato : afirmar a expressão [, argumentos] Quando assert encontra uma declaração, Python avalia a expressão.Se a declaração não for verdadeira, uma exceção é levantada (assertionError). Se a afirmação falhar, Python usa ArgumentExpression como argumento para o erro de AssertionError. As exceções do erro de AssertionError podem ser capturadas e tratadas como qualquer outra exceção usando a declaração try-except, mas se não forem tratadas, elas terminarão o programa e produzirão um Traco. Exemplo:

def KelvinToFahrenheit(Temperature):    
    assert (Temperature >= 0),"Colder than absolute zero!"    
    return ((Temperature-273)*1.8)+32    
print KelvinToFahrenheit(273)    
print int(KelvinToFahrenheit(505.78))    
print KelvinToFahrenheit(-5)    

Quando o código acima é executado, produz o seguinte resultado:

32.0
451
Traceback (most recent call last):    
  File "test.py", line 9, in <module>    
    print KelvinToFahrenheit(-5)    
  File "test.py", line 4, in KelvinToFahrenheit    
    assert (Temperature >= 0),"Colder than absolute zero!"    
AssertionError: Colder than absolute zero!    
 -2
Author: user3423267, 2014-12-26 15:41:12
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)

>>> #first we try without assert
>>>if test_us == True:
    print("YES! I am right!")
else:
    print("I am Wrong, but the program still RUNS!")

I am Wrong, but the program still RUNS!


>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert test_us
AssertionError
>>> 
 -3
Author: rianhariadi.com, 2017-04-25 05:04:15

Basicamente a palavra-chave assertiva significa que se a condição não é verdadeira, então ela através de um erro assertionerror ou então ela continua, por exemplo, em python.

Código-1

a=5

b=6

assert a==b

Resultado:

assert a==b

AssertionError

Código-2

a=5

b=5

assert a==b

Resultado:

Process finished with exit code 0
 -3
Author: ujjwal_bansal, 2017-07-27 07:22:48