Co to jest obiekt „NoneType”?


87

Po uruchomieniu mojego skryptu w języku Python pojawia się ten błąd:

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

Jestem prawie pewien, że „str” oznacza ciąg, ale nie wiem, co to jest obiekt „NoneType”. Mój skrypt psuje się w drugiej linii, wiem, że pierwsza działa, ponieważ polecenia z tej linii są w mojej asie, tak jak bym się spodziewał. Na początku pomyślałem, że może tak być, ponieważ używam zmiennych i danych wejściowych użytkownika wewnątrz send_command.

Wszystko w „CAPS” to zmienne, wszystko zapisane „małymi literami” pochodzi z opcji „parser.add_option”.

Używam pexpect i optparse

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

2
Musimy zobaczyć więcej kodu i dane wejściowe - NoneTyoe oznacza, że ​​jedna ze zmiennych nie została ustawiona
mmmmmm

3
NoneTypejest typem wartości pojedynczej None. Jedna z wartości nie jest ciągiem.
Martijn Pieters

Quick & Dirty: umieść każdy termin do konkatenacji w str()str (SNMPSRVUSRCMD) + str (snmpuser) + ...
PeterMmm

2
@PeterMmm To okropny pomysł - problem pojawi się (być może gorzej) w dalszej części. Na początku lepiej byłoby dowiedzieć się, dlaczego jedną ze zmiennych jest Brak.
arshajii

Odpowiedzi:


82

NoneTypejest typem Noneobiektu, który jest obiektem, który nie wskazuje wartości . Nonejest wartością zwracaną przez funkcje, które „niczego nie zwracają”. Jest to również typowa domyślna wartość zwracana dla funkcji, które czegoś szukają i mogą to znaleźć lub nie; na przykład jest zwracany, re.searchgdy wyrażenie regularne nie pasuje lub dict.getgdy klucz nie ma wpisu w dict. Nie możesz dodawać Nonedo łańcuchów ani innych obiektów.

Jedna z twoich zmiennych Nonenie jest łańcuchem. Być może zapomniałeś o returnjednej ze swoich funkcji, a może użytkownik nie podał opcji wiersza poleceń i optparsepodał Nonewartość tej opcji. Kiedy próbujesz dodać Nonedo ciągu, otrzymujesz ten wyjątek:

send_command(child, SNMPGROUPCMD + group + V3PRIVCMD)

Jednym z grouplub SNMPGROUPCMDczy V3PRIVCMDma Nonejak jej wartości.


Dzięki!! Masz rację, jedna z moich opcji wprowadzania danych przez użytkownika z jakiegoś powodu nie działała. Dodałem to jako "nazwa" vs opcja i boom, zadziałało. Teraz muszę tylko dowiedzieć się, dlaczego nie jest to odpowiednia opcja, wszystkie inne opcje działają dobrze.
niepewne-IT

1
"Nie ustawiono" jest trochę niejasne ... jeśli zmienna nie jest zdefiniowana i próbujesz wykonać na niej jakąś operację, powinieneś otrzymać plik NameError. Można go również ustawić, ale równe None("ustawione na nic" = "nie ustawione"?), Wtedy możesz je otrzymać TypeError.
Nick T

Zasadniczo (dla ludzi C / Java tutaj) none = null
Zoe

23

NoneTypejest po prostu typem Nonesingletona:

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

Z tego ostatniego linku powyżej:

None

Jedyna wartość typu NoneType. Nonejest często używany do reprezentowania braku wartości, na przykład gdy domyślne argumenty nie są przekazywane do funkcji. Przydziały do Nonesą nielegalne i podnoszą SyntaxError.

W twoim przypadku wygląda na to, że jednym z elementów, które próbujesz połączyć, jest None, stąd twój błąd.


21

Ze względu na programowanie obronne, obiekty powinny być sprawdzane pod kątem nieważności przed użyciem.

if obj is None:

lub

if obj is not None:

2
„is” powinno być używane tylko wtedy, gdy jest to potrzebne. Najlepsze programowanie obronne to testy, dużo testów.
Jürgen A. Erhard

2
Programowanie obronne to jedna z najgorszych rzeczy. Jeśli znajdziesz taki błąd, oznacza to, że popełniłeś błąd w programowaniu. Takie rzeczy jak „sprawdzanie wartości null przed użyciem” ukrywają tylko poważny błąd. Powinieneś pozwolić na wyrzucenie wyjątku. I nie zmuszaj programistów do rzucania niestandardowych wyjątków, jest to naprawdę uciążliwe. Niech naturalny błąd zostanie odrzucony. W rzeczywistości programowanie obronne jest symptomem tego, że powinieneś używać innego języka.
bzim,

Pytam o bazę danych przez sqlAlchemy. Nie ma rezultatu. Zwracany obiekt to Brak. Co oznacza brak wyniku. Nie ma błędu. Sprawdzasz, czy wynik jest brak, jeśli nie, używasz obiektu wyniku. Nie ma w tym nic złego. Najgorszą rzeczą w programowaniu jest dogmatyzm.
jedność 100

17

Oznacza to, że próbujesz połączyć ciąg z czymś, co jest None.

Brak jest „null” języka Python i NoneTypejest jego typem.

Ten kod spowoduje ten sam rodzaj błędu:

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


2

W komunikacie o błędzie, zamiast mówić, że nie można łączyć dwóch obiektów, pokazując ich wartości (ciąg znaków iw Nonetym przykładzie), interpreter Pythona informuje o tym, pokazując typy obiektów, które próbowano połączyć. Typ każdego ciągu to strczas Nonewywołania typu pojedynczej instancjiNoneType .

Zwykle nie musisz się tym zajmować NoneType, ale w tym przykładzie trzeba to wiedzieć type(None) == NoneType.


Mam bardzo podobny problem i próbuję wykryć, czy obiekt to NoneType, twoja afirmacja nie działa dla mnie: >>> 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 NoneTypenie jest nigdzie zdefiniowane (o czym jestem świadomy). Jeśli chcesz sprawdzić, czy wartość jest None, po prostu użyj key is None(patrz stackoverflow.com/questions/23086383/… ). W przeciwnym razie możesz użyć type(key) == type(None)tego samego efektu.
Feuermurmel

1

Twój błąd występuje z powodu czegoś takiego: >>>
>>> None + "hello world"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

Obiekt None w Pythonie jest z grubsza równoważny z null , nil itp. W innych językach.


0

Jednej ze zmiennych nie nadano żadnej wartości, dlatego jest to NoneType. Będziesz musiał sprawdzić, dlaczego tak jest, prawdopodobnie jest to prosty błąd logiczny z Twojej strony.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.