Aqui estão quatro invocações simples de assert:
>>> assert 1==2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert 1==2, "hi"
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError: hi
>>> assert(1==2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
>>> assert(1==2, "hi")
Observe que o último não gera um erro. Qual é a diferença entre chamar assert com ou sem parênteses que causa esse comportamento? Minha prática é usar parênteses, mas o que foi dito acima sugere que eu não deveria.
python
assert
parentheses
Gaefan
fonte
fonte
Respostas:
O último
assert
teria dado a você um aviso (SyntaxWarning: assertion is always true, perhaps remove parentheses?
) se você o executasse por meio de um interpretador completo, não por meio do IDLE. Porassert
ser uma palavra-chave e não uma função, você está, na verdade, passando uma tupla como o primeiro argumento e omitindo o segundo argumento.Lembre-se de que tuplas não vazias avaliam como
True
e, como a mensagem de asserção é opcional, você essencialmente chamouassert True
quando escreveuassert(1==2, "hi")
.fonte
assert (1==2)
parênteses em torno de uma única expressão não criarão uma tupla automaticamente; você obteria o mesmo comportamento de # 4 se o fizesseassert (1==2,)
. A mesma coisa aconteceria se você fizesse emprint ('foo', 'bar')
vez deprint 'foo', 'bar'
; você veria a saída da tuplaassert(test, message)
provavelmente estão erradas, e certamente confusas. Sem parênteses!Se você colocou o parêntese aqui porque queria uma declaração de várias linhas, uma alternativa é colocar uma barra invertida no final da linha como esta:
Impressões:
Por que esse python
assert
precisa ser diferente de tudo o mais:Acho que a ideologia pitônica é que um programa deve se autocorrigir sem ter que se preocupar com o sinalizador especial para ativar as afirmações. A tentação de desativar afirmações é muito grande e, portanto, está sendo descontinuada.
Compartilho seu aborrecimento pelo fato de o python
assert
ter uma sintaxe exclusiva em relação a todas as outras construções de programação do python, e essa sintaxe mais uma vez mudou de python2 para python3 e novamente de python 3.4 para 3.6. Fazer afirmações não compatíveis com versões anteriores de qualquer versão para qualquer outra versão.É um tapinha no ombro de
assert
um cidadão de 3ª classe, será totalmente removido no python4 e, certamente, novamente no Python 8.1.fonte
assert 1==2, "hi"
é analisadoassert 1==2, "hi"
com "hi" como o segundo parâmetro da palavra-chave. Daí porque ele dá um erro apropriadamente.assert(1==2)
é analisado comoassert (1==2)
sendo idêntico aassert 1==2
, porque os parênteses em torno de um único item não criam uma tupla, a menos que haja uma vírgula final, por exemplo(1==2,)
.assert(1==2, "hi")
é analisado comoassert (1==2, "hi")
, o que não dá um erro porque uma tupla(False, "hi")
não vazia não é um valor falso e não há um segundo parâmetro fornecido para a palavra-chave.Você não deve usar parênteses porque
assert
não é uma função em Python - é uma palavra-chave.fonte
Você pode quebrar a declaração assert sem fazer
\
isso:Ou se você tiver uma mensagem ainda mais longa:
fonte
A seguir é citado a partir do documento python
A forma simples, expressão assert, é 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)
Então, quando você está usando parênteses aqui, você está usando a forma simples, e a expressão é avaliada como uma tupla, que é sempre True quando convertida em bool
fonte