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.


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 .


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


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.


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))

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.


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


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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.