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)
niepewne-IT
źródło
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.

Burhan Khalid
źródło
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.

arshajii
źródło
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:
Gürol Canbek
źródło
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
André Laszlo
źródło
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.

Feuermurmel
źródło
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.

Dave
źródło
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.

SeanOTRS
źródło