Como "testar" o NoneType em python?

398

Eu tenho um método que às vezes retorna um valor NoneType. Então, como posso questionar uma variável que é um NoneType? Eu preciso usar o método if , por exemplo

if not new:
    new = '#'

Sei que é o caminho errado e espero que você entenda o que eu quis dizer.

CrveniZg
fonte
Eu acho que isso foi respondida aqui e, aparentemente, em algum lugar antes
yorodm
Se Noneé o único valor que seu método retorna para o qual bool(returnValue)é igual False, então if not new:deve funcionar bem. Às vezes, isso ocorre nas bibliotecas internas - por exemplo, re.matchretorna Nenhum ou um objeto de correspondência verdade.
Kevin
Veja também minha resposta sobre nulle Noneem python aqui .
Michael Ekoka

Respostas:

631

Então, como posso questionar uma variável que é um NoneType?

Usar isoperador, assim

if variable is None:

Por que isso funciona?

Como Noneé o único objeto singleton do NoneTypePython, podemos usar o isoperador para verificar se uma variável possui Noneou não.

Citando isdocumentos ,

Os operadores ise o is notteste da identidade do objeto: x is ysão verdadeiros se e somente se xe ysão o mesmo objeto. x is not yproduz o valor inverso da verdade.

Como só pode haver uma instância de None, isseria a maneira preferida de verificar None.


Ouça da boca do cavalo

Citando as Diretrizes de estilo de codificação do Python - PEP-008 (definidas em conjunto pelo próprio Guido),

As comparações com singletons como Nonesempre devem ser feitas com isouis not , nunca com os operadores de igualdade .

thefourtheye
fonte
Então, qual é a diferença entre == Nonee is None?
No7
@NoName Com relação a None, ambos produzirão resultados semelhantes.
thefourtheye
2
isso não funciona se comparar se pandasexiste um DataFrame - para isso, eu type(df) is type(None)The truth value of a DataFrame is ambiguous
costumo
74
if variable is None:
   ...

if variable is not None:
   ...
elhoucine
fonte
27

Ele também pode ser feito com isinstancede acordo com a resposta de Alex Hall :

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance também é intuitivo, mas há a complicação de exigir a linha

NoneType = type(None)

o que não é necessário para tipos como inte float.

cardamomo
fonte
Como você não pode subclassificar NoneTypee como Noneé um singleton, isinstancenão deve ser usado para detectar None- em vez disso, faça o que a resposta aceita diz e use is Noneor is not None.
Aaron Hall
18

Como apontado pelo comentário de Aaron Hall:

Como você não pode subclassificar NoneTypee como Noneé um singleton, isinstancenão deve ser usado para detectar None- em vez disso, faça o que a resposta aceita diz e use is Noneor is not None.


Resposta original:

A maneira mais simples, no entanto, sem a linha extra, além da resposta do cardamomo, é provavelmente:
isinstance(x, type(None))

Então, como posso questionar uma variável que é um NoneType? Eu preciso usar if método

O uso isinstance()não requer um isdentro da ifdeclaração:

if isinstance(x, type(None)): 
    #do stuff

Informações adicionais
Você também pode verificar vários tipos em uma isinstance()instrução, conforme mencionado na documentação . Basta escrever os tipos como uma tupla.

isinstance(x, (type(None), bytes))
Martin Müsli
fonte
11
Como você não pode subclassificar NoneTypee como Noneé um singleton, isinstancenão deve ser usado para detectar None- em vez disso, faça o que a resposta aceita diz e use is Noneor is not None.
Aaron Hall
11
Esta resposta foi útil parapython 3.6.7
Santhosh Dhaipule Chandrakanth
@AaronHall Por isinstance que não deve ser usado? Entendo que isso isdeve ser preferido, mas há alguns casos em que o formulário isinstance parece mais natural (como verificar vários tipos ao mesmo tempo isinstance(x, (str, bool, int, type(None)))). É apenas uma preferência pessoal ou há uma ressalva que eu não conheço?
Conchylicultor
@Conchylicultor desvanta a sua sugestão: 1. pesquisa global por type2., em seguida, chamando-a 3. e, em seguida, pesquisando o tipo de None- quando Noneé um singleton e uma palavra-chave. Outra desvantagem: 4. isso é muito fora do padrão e levanta as sobrancelhas quando as pessoas estão olhando para o seu código. x is Noneé uma verificação mais otimizada. Eu sugeriria x is None or isinstance(x, (str, bool, int))- mas também sugeriria que você pensasse mais sobre o que está fazendo quando faz esse tipo de verificação de tipo para tipos que não têm muito em comum ...
Aaron Hall
4

Não tenho certeza se isso responde à pergunta. Mas sei que demorei um pouco para descobrir. Eu estava percorrendo um site e, de repente, o nome dos autores não estava mais lá. Então, precisava de uma declaração de cheque.

if type(author) == type(None):
     my if body
else:
    my else body

O autor pode ser qualquer variável nesse caso e Nonepode ser de qualquer tipo que você está verificando.

Joshua Pachner
fonte
Como Noneé um singleton, typenão deve ser usado para detectar None- você deve fazer o que a resposta aceita diz e usar is Noneor is not None.
Aaron Hall
2

Python 2.7:

x = None
isinstance(x, type(None))

ou

isinstance(None, type(None))

==> Verdadeiro

Pesko
fonte
11
Como você não pode subclassificar NoneTypee como Noneé um singleton, isinstancenão deve ser usado para detectar None- em vez disso, faça o que a resposta aceita diz e use is Noneor is not None.
Aaron Hall
Ah ok! Obrigado !
Pesko
0

Espero que este exemplo seja útil para você)

print(type(None) # NoneType

Então, você pode verificar o tipo do nome da variável

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
alexmosk25
fonte