Cos'è un oggetto "NoneType"?


89

Ricevo questo errore quando eseguo il mio script python:

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

Sono abbastanza sicuro che "str" ​​significhi stringa, ma non so cosa sia un oggetto "NoneType". Il mio script cagiona sulla seconda riga, so che la prima funziona perché i comandi di quella riga sono nel mio asa come mi aspetterei. All'inizio ho pensato che potrebbe essere perché sto usando variabili e input dell'utente all'interno di send_command.

Tutto in "MAIUSCOLO" sono variabili, tutto in "minuscolo" viene immesso dalle opzioni "parser.add_option".

Sto usando pexpect e optparse

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)
send_command(child, SNMPSRVUSRCMD + snmpuser + group + V3AUTHCMD + snmphmac + snmpauth + PRIVCMD + snmpencrypt + snmppriv)

2
Dobbiamo vedere più codice e l'input - NoneTyoe significa che una delle variabili non è stata impostata
mmmmmm

3
NoneTypeè il tipo del valore singleton None. Uno dei tuoi valori non è una stringa.
Martijn Pieters

Quick & Dirty: metti ogni termine da concatenare in str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm È un'idea terribile: il problema si manifesterà (forse peggiore) più avanti. Sarebbe meglio capire perché una delle variabili è Nessuno per cominciare.
arshajii

Risposte:


83

NoneTypeè il tipo per l' Noneoggetto, che è un oggetto che non indica alcun valore . Noneè il valore di ritorno delle funzioni che "non restituiscono nulla". È anche un valore di ritorno predefinito comune per le funzioni che cercano qualcosa e possono o non possono trovarlo; ad esempio, viene restituito dare.search quando la regex non corrisponde o dict.getquando la chiave non ha alcuna voce nel dict. Non è possibile aggiungere Nonea stringhe o altri oggetti.

Una delle tue variabili è None, non una stringa. Forse ti sei dimenticato di returnin una delle tue funzioni, o forse l'utente non ha fornito un'opzione della riga di comando e optparseti ha fornito Noneil valore di tale opzione. Quando provi ad aggiungere Nonea una stringa, ottieni quell'eccezione:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Uno dei groupo SNMPGROUPCMDo V3PRIVCMDha Noneil suo valore.


Grazie!! Hai ragione, una delle mie opzioni di input utente non funzionava per qualche motivo. L'ho aggiunto come "nome" rispetto a un'opzione e boom, ha funzionato. Ora devo solo scoprire perché questa non viene presa correttamente come opzione, tutte le altre opzioni funzionano bene.
insicuro-IT

1
"Non impostato" è un po 'vago ... se una variabile non è definita e provi a eseguire qualche operazione con essa, dovresti ottenere un file NameError. Potrebbe anche essere impostato, ma uguale a None("set to nothing" = "not set"?), Quindi potresti averne un po ' TypeError.
Nick T

Fondamentalmente (per la gente di C / Java qui) none = null
Zoe

24

NoneTypeè semplicemente il tipo del Nonesingleton:

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

Da quest'ultimo collegamento sopra:

None

L'unico valore del tipo NoneType. Noneviene spesso utilizzato per rappresentare l'assenza di un valore, come quando gli argomenti predefiniti non vengono passati a una funzione. Le assegnazioni a Nonesono illegali e aumentare a SyntaxError.

Nel tuo caso, sembra che uno degli elementi che stai cercando di concatenare sia None, da qui il tuo errore.


21

Per motivi di programmazione difensiva, gli oggetti dovrebbero essere verificati contro la nullità prima dell'uso.

if obj is None:

o

if obj is not None:

2
"is" dovrebbe essere utilizzato solo se necessario. La migliore programmazione difensiva sono i test, molti test.
Jürgen A. Erhard

2
La programmazione difensiva è una delle cose più malvagie. Se trovi un errore del genere, significa che hai fatto un errore di programmazione. Cose come "verificare la presenza di null prima dell'uso" nascondono solo alcuni errori gravi. Dovresti lasciare che venga generata l'eccezione. E non costringere i programmatori a lanciare qualche eccezione personalizzata, è davvero ingombrante. Lascia che l'errore naturale venga lanciato. In effetti, la programmazione difensiva è un sintomo che dovresti usare un altro linguaggio.
bzim

1
Interrogo il database tramite sqlAlchemy. Non ci sono risultati. L'oggetto restituito è Nessuno. Il che significa nessun risultato. Non ci sono errori. Controlli se un risultato è nessuno, altrimenti usi l'oggetto risultato. Niente di male in questo. La cosa più malvagia della programmazione è il dogmatismo.
100

17

Significa che stai cercando di concatenare una stringa con qualcosa che è None.

Nessuno è il "null" di Python ed NoneTypeè il suo tipo.

Questo codice genererà lo stesso tipo di errore:

>>> bar = "something"
>>> foo = None
>>> print foo + bar
TypeError: cannot concatenate 'str' and 'NoneType' objects


2

Nel messaggio di errore, invece di dirti che non puoi concatenare due oggetti mostrandone i valori (una stringa e Nonein questo esempio), l'interprete Python ti dice questo mostrando i tipi degli oggetti che hai provato a concatenare. Il tipo di ogni stringa è strmentre Noneviene chiamato il tipo della singola istanzaNoneType .

Normalmente non devi preoccuparti NoneType, ma in questo esempio è necessario saperlo type(None) == NoneType.


Ho un problema molto simile e sto cercando di rilevare se l'oggetto è NoneType, la tua affermazione non funziona per me: >>> 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 NoneTypenon è definito da nessuna parte (di cui sono a conoscenza). Se vuoi controllare se un valore è None, usa semplicemente key is None(vedi stackoverflow.com/questions/23086383/… ). Altrimenti potresti usare type(key) == type(None)lo stesso effetto.
Feuermurmel

1

Il tuo errore si è verificato a causa di qualcosa del genere:
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
>>>

L' oggetto None di Python è più o meno equivalente a null , nil , ecc. In altri linguaggi.


0

A una delle variabili non è stato assegnato alcun valore, quindi è un NoneType. Dovrai esaminare il motivo per cui questo è probabilmente un semplice errore logico da parte tua.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.