O que é um objeto 'NoneType'?

87

Estou recebendo este erro quando executo meu script Python:

TypeError: cannot concatenate 'str' and 'NoneType' objects

Tenho certeza de que 'str' significa string, mas não sei o que é um objeto 'NoneType'. Meu script caga na segunda linha, eu sei que a primeira funciona porque os comandos daquela linha estão na minha asa como eu esperava. A princípio pensei que poderia ser porque estou usando variáveis ​​e entrada do usuário dentro de send_command.

Tudo em 'CAPS' são variáveis, tudo em 'minúsculas' é inserido nas opções de 'parser.add_option'.

Estou usando o pexpect e optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)
inseguro-TI
fonte
2
Precisamos ver mais código e a entrada - NoneTyoe significa que uma das variáveis ​​não foi definida
mmmmmm
3
NoneTypeé o tipo de valor singleton None. Um dos seus valores não é uma string.
Martijn Pieters
Quick & Dirty: coloque cada termo para concatenar em str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm
2
@PeterMmm Essa é uma ideia terrível - o problema apenas se manifestará (talvez pior) mais adiante. Seria melhor descobrir por que uma das variáveis ​​é Nenhum para começar.
arshajii

Respostas:

82

NoneTypeé o tipo do Noneobjeto, que é um objeto que não indica nenhum valor . Noneé o valor de retorno de funções que "não retornam nada". É também um valor de retorno padrão comum para funções que procuram algo e podem ou não encontrá-lo; por exemplo, ele é retornado re.searchquando a regex não corresponde ou dict.getquando a chave não tem entrada no dict. Você não pode adicionar Nonestrings ou outros objetos.

Uma de suas variáveis ​​é None, não uma string. Talvez você tenha esquecido returnem uma de suas funções ou talvez o usuário não forneceu uma opção de linha de comando e optparseforneceu Noneo valor dessa opção. Ao tentar adicionar Nonea uma string, você obtém a exceção:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Um de group ou SNMPGROUPCMDouV3PRIVCMD tem Nonecomo valor.

Burhan Khalid
fonte
Obrigado!! Você onde correto, uma das minhas opções de entrada do usuário não estava funcionando por algum motivo. Eu adicionei isso como um "nome" em vez de uma opção e pronto, funcionou. Agora só preciso descobrir por que isso não está sendo considerado uma opção adequada, todas as outras opções estão funcionando bem.
inseguro-IT
1
"Not set" é um pouco vago ... se uma variável não for definida e você tentar realizar alguma operação com ela, deverá obter um NameError. Também pode ser definido, mas igual a None("definido como nada" = "não definido"?), Então você pode obter alguns TypeError.
Nick T
Basicamente (para o pessoal de C / Java aqui) none = null
Zoe
23

NoneTypeé simplesmente o tipo de Nonesingleton:

>>> type(None)
<type 'NoneType'>

Do último link acima:

None

O único valor do tipo NoneType. Noneé freqüentemente usado para representar a ausência de um valor, como quando os argumentos padrão não são passados ​​para uma função. As atribuições a Nonesão ilegais e aumentam a SyntaxError.

No seu caso, parece que um dos itens que você está tentando concatenar é None, daí o seu erro.

Arshajii
fonte
21

Para fins de programação defensiva, os objetos devem ser verificados em relação à nulidade antes de usar.

if obj is None:

ou

if obj is not None:
Gürol Canbek
fonte
2
"is" só deve ser usado se necessário. A melhor programação defensiva são os testes, muitos testes.
Jürgen A. Erhard
2
A programação defensiva é uma das coisas mais perversas. Se você encontrar um erro como esse, significa que cometeu um erro ao programar. Coisas como "verificar se há nulos antes de usar" apenas escondem alguns erros graves. Você deve deixar a exceção ser lançada. E não faça os programadores lançar alguma exceção personalizada, é realmente complicado. Deixe o erro natural ser lançado. Na verdade, a programação defensiva é um sintoma de que você deve usar outra linguagem.
bzim
Eu consulto o banco de dados via sqlAlchemy. Não há resultado. O objeto retornado é Nenhum. O que significa nenhum resultado. Não há erro. Você verifica se um resultado é nenhum, caso contrário, você usa o objeto de resultado. Nada de mal nisso. A coisa mais perversa da programação é o dogmatismo.
Unit100 01 de
17

Isso significa que você está tentando concatenar uma string com algo que é None .

Nenhum é o "nulo" de Python e NoneType é seu tipo.

Este código gerará o mesmo tipo de erro:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects
André Laszlo
fonte
2

Na mensagem de erro, em vez de dizer que você não pode concatenar dois objetos mostrando seus valores (uma string e None, neste exemplo), o interpretador Python informa isso mostrando os tipos de objetos que você tentou concatenar. O tipo de cada string é strenquanto o tipo da única Noneinstância é chamada NoneType.

Você normalmente não precisa se preocupar com NoneType, mas neste exemplo é necessário saber disso type(None) == NoneType.

Feuermurmel
fonte
Eu tenho um problema muito semelhante e tentando detectar se o objeto é NoneType, sua afirmação não funciona para mim: >>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
RuBiCK
2
@RuBiCK NoneTypenão está definido em nenhum lugar (que eu saiba). Se você quiser verificar se um valor é None, basta usar key is None(consulte stackoverflow.com/questions/23086383/… ). Caso contrário, você pode usar type(key) == type(None)para o mesmo efeito.
Feuermurmel
1

Seu erro está ocorrendo devido a algo assim:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>

Python's objeto None é aproximadamente equivalente a null , nil , etc. em outras linguagens.

Dave
fonte
0

Uma das variáveis ​​não recebeu nenhum valor, portanto, é um NoneType. Você terá que descobrir o porquê disso, provavelmente é um erro de lógica simples de sua parte.

SeanOTRS
fonte