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)
NoneType
jest typem wartości pojedynczejNone
. Jedna z wartości nie jest ciągiem.str()
str (SNMPSRVUSRCMD) + str (snmpuser) + ...Odpowiedzi:
NoneType
jest typemNone
obiektu, który jest obiektem, który nie wskazuje wartości .None
jest 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.search
gdy wyrażenie regularne nie pasuje lubdict.get
gdy klucz nie ma wpisu w dict. Nie możesz dodawaćNone
do łańcuchów ani innych obiektów.Jedna z twoich zmiennych
None
nie jest łańcuchem. Być może zapomniałeś oreturn
jednej ze swoich funkcji, a może użytkownik nie podał opcji wiersza poleceń ioptparse
podałNone
wartość tej opcji. Kiedy próbujesz dodaćNone
do ciągu, otrzymujesz ten wyjątek:Jednym z
group
lubSNMPGROUPCMD
czyV3PRIVCMD
maNone
jak jej wartości.źródło
NameError
. Można go również ustawić, ale równeNone
("ustawione na nic" = "nie ustawione"?), Wtedy możesz je otrzymaćTypeError
.NoneType
jest po prostu typemNone
singletona:>>> type(None) <type 'NoneType'>
Z tego ostatniego linku powyżej:
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.źródło
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:
źródło
Oznacza to, że próbujesz połączyć ciąg z czymś, co jest
None
.Brak jest „null” języka Python i
NoneType
jest jego typem.Ten kod spowoduje ten sam rodzaj błędu:
>>> bar = "something" >>> foo = None >>> print foo + bar TypeError: cannot concatenate 'str' and 'NoneType' objects
źródło
W Pythonie, aby przedstawić brak wartości, możesz użyć
None
wartościtypes.NoneType.None
źródło
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
None
tym przykładzie), interpreter Pythona informuje o tym, pokazując typy obiektów, które próbowano połączyć. Typ każdego ciągu tostr
czasNone
wywołania typu pojedynczej instancjiNoneType
.Zwykle nie musisz się tym zajmować
NoneType
, ale w tym przykładzie trzeba to wiedziećtype(None) == NoneType
.źródło
>>> type(key) <type 'NoneType'> >>> type(key) == NoneType Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'NoneType' is not defined
NoneType
nie jest nigdzie zdefiniowane (o czym jestem świadomy). Jeśli chcesz sprawdzić, czy wartość jestNone
, po prostu użyjkey is None
(patrz stackoverflow.com/questions/23086383/… ). W przeciwnym razie możesz użyćtype(key) == type(None)
tego samego efektu.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.
źródło
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.
źródło
Nonetype jest typem None.
Zobacz dokumentację tutaj: https://docs.python.org/2/library/types.html#types.NoneType
źródło