Krajta je populární a všestranný programovací jazyk, ale jako každý jiný jazyk může způsobit chyby, které mohou být frustrující při ladění. Jednou z běžných chyb, se kterou se vývojáři setkávají, je TypeError: Objekt „NoneType“ nelze iterovat. V tomto článku prozkoumáme různé scénáře, kde k této chybě může dojít, a poskytneme praktická řešení, která vám pomohou ji efektivně řešit.
Pochopení chyby: Objekt NoneType není iterovatelný
Chybová zpráva TypeError: Objekt „NoneType“ nelze iterovat v Krajta obvykle nastane, když se pokusíte iterovat přes objekt, který má hodnotu Žádný . Tato chyba je vyvolána, protože None není iterovatelný, což znamená, že jej nemůžete opakovat jako u seznamů, n-tic nebo jiných iterovatelných objektů.
syntaxe: TypeError: Objekt „NoneType“ nelze iterovat
Příčiny TypeError: Objekt „NoneType“ nelze iterovat
- Chybí prohlášení o vrácení
- Neplatná odpověď API
- Iterace přes proměnnou s hodnotou None
- Žádná Chyba typu ve třídách
- Chyba funkcí Lambda a NoneType
Chybí prohlášení o vrácení
Jedním z nejběžnějších scénářů vedoucích k této chybě je chybějící příkaz return ve funkci. Řekněme, že máme funkci, která má vracet a seznam čísel, ale zapomněli jsme zahrnout příkaz return:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Výstup
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 for num in result: 7 print(num) TypeError: 'NoneType' objekt nelze iterovat>
V tomto případě, ' generovat_čísla()' nevrací nic, což znamená, že vrací Žádné. Když se pokusíme opakovat výsledek, narazíme na „ TypeError' protože nemůžeme iterovat přes None.
Řešení: Zajistěte řádné vrácení
Chcete-li tuto chybu opravit, ujistěte se, že naše funkce vrací očekávanou hodnotu. V tomto příkladu bychom měli přidat příkaz return do ‘generate_numbers()’:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Výstup
1 2 3 4 5>
Nyní, generovat_čísla() vrátí seznam čísel a chyba je vyřešena.
konečné klíčové slovo v jazyce Java
Neplatná odpověď API
Další scénář, kdy se můžete setkat s touto chybou, je při práci s API . Řekněme, že zadáváme požadavek API na načtení dat, ale API vrací Žádné místo očekávaných dat:
Python3
import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> None> data>=> fetch_data()> for> item>in> data:> >print>(item)> |
>
>
Výstup
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 pro položku v datech: 12 print(item) TypeError: 'NoneType' objekt nelze iterovat>
Pokud API požadavek selže nebo se vrátí Žádný, dostaneme a 'Chyba typu' při pokusu o iteraci přes data.
Řešení: Zkontrolujte odezvu API
Abychom tuto situaci zvládli, měli bychom před pokusem o iteraci zkontrolovat odpověď API. Zde je vylepšená verze kódu:
Python3
import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> [ ]> data>=> fetch_data()> for> item>in> data:> >print>(item)> |
>
>
Pokud stavový kód není 200, znamená to, že došlo k problému s API žádost. V tomto případě vrátíme prázdný seznam [] jako zástupnou hodnotu namísto None. Vrácení prázdného seznamu nám umožňuje vyhnout se „NoneType“ chyba při pokusu o iteraci dat odpovědi později v kódu.
Iterace přes proměnnou s hodnotou None
Tento scénář je jednoduchý a běžný. Dochází k tomu, když se pokoušíme opakovat (iterovat) proměnnou, která má hodnotu Žádná:
Python3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Výstup
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 pro položku v mém_seznamu: 3 print(item) TypeError: 'NoneType' objekt nelze iterovat>
V tomto scénáři proměnná „ můj seznam' je nastaveno na Žádný. Když se smyčka for pokusí iterovat 'můj seznam' , naráží na TypeError: Objekt „NoneType“ nelze iterovat. K této chybě dochází, protože None není iterovatelný objekt a nemůžeme procházet smyčkou.
Řešení: Zajištění opakovatelné přítomnosti před opakováním
Abychom tuto chybu napravili, musíme to zajistit 'můj seznam' obsahuje iterovatelný objekt (jako je seznam, n-tice atd.), než se nad ním pokusí iterovat. Přidání šeku jako pokud můj_seznam není Žádný před smyčkou zajišťuje, že kód uvnitř smyčky běží pouze v případě můj seznam není Žádná, brání „NoneType“ chyba.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
mysql aktualizace připojit
>
>
Žádná Chyba typu ve třídách
Třídy v Krajta může také narazit „NoneType“ chyby, zejména při práci s metodami, které vracejí Žádné. Zvažte třídu s metodou, která nevrací žádnou hodnotu.
Předpokládejme, že máme třídu pojmenovanou 'Student'. V tomto kurzu chceme uložit jméno studenta a jeho hodnocení. Třída má metodu tzv ‘get_grades()’ což by logicky mělo vrátit studentovi známky. V této situaci student jménem „ Alisha' je vytvořen se seznamem známek. Záměrem je zkontrolovat, zda je některý z Alishiných známek vyšší nebo rovný 90, a vytisknout je
Zde je počáteční kód:
Python3
class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >print>(>self>.grade)> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>=>90>:> >print>(grade)> |
>
>
Výstup
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 4 line 13 8 print(self.grade) 11 student = Student('Alisha',[90,85,88,92]) --->13 pro známku v student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' objekt nelze iterovat> Problém spočívá v ‘get_grades()’ metoda. Známky sice tiskne, ale nevrací je. Když se pokusíme projít ‘student.get_grades()’ , vytiskne známky, ale neposkytne vám žádné hodnoty, se kterými byste mohli ve smyčce pracovat.
Takže, když se pokusíme opakovat výsledek ‘student.get_grades()’, implicitně se vrací 'Žádný' protože v souboru není žádný explicitní příkaz return ‘get_grades()’ metoda. Krajta považuje to za Žádné, což nelze opakovat. V důsledku toho se setkáváme s a TypeError: Objekt „NoneType“ nelze iterovat chyba.
Řešení: Vrácení příslušných hodnot z metod třídy
Abychom tento problém vyřešili, musíme upravit ‘get_grades()’ metoda. Místo pouhého tisku známek by je měl vrátit. Vrácení stupňů znamená poskytnutí iterovatelného (v tomto případě seznamu stupňů) volajícímu metody. Vrácením hodnocení se metoda stává iterovatelnou a smyčka může fungovat tak, jak bylo zamýšleno.
Python3
class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >return> self>.grade> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>=>90>:> >print>(grade)> |
>
>
Takže v tomto opraveném kódu je ‘get_grades()’ metoda vrací ‘vlastní stupeň’, což je seznam známek. Když to opakujeme ‘student.get_grades()’ , budeme opakovat seznam známek a žádné nebudou „NoneType“ chyba, protože iterujeme přes platný iterovatelný objekt.
transformovat řetězec na int
Výstup
90 92>
Chyba funkcí Lambda a NoneType
Chyba TypeError: Objekt „NoneType“ nelze iterovat může nastat v funkce lambda když funkce lambda v určitých situacích vrátí Žádné. To se obvykle stane, když podmíněně vrátíme None pro konkrétní vstupní hodnoty. Když se pokusíme iterovat výsledek funkce lambda, která vrací Žádné, narazíme na tuto chybu.
Příklad: V tomto příkladu, pokud vstup X není větší než 0 (x>0) , funkce lambda vrátí Žádné. Když se snažíme iterovat přes výsledek, snažíme se iterovat přes None, což způsobuje TypeError: Objekt „NoneType“ nelze iterovat chyba.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Výstup
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 else None 2 result = my_lambda(-1) ----> 3 for item in result: 4 print(item) TypeError: 'NoneType' object is not iterable>
Řešení: Zajištění opakovatelných výsledků
Abychom tuto chybu opravili, měli bychom zpracovat případ, kdy funkce lambda vrací Žádné. Jedním ze způsobů, jak to zvládnout, je poskytnout výchozí iterovatelný (jako je prázdný seznam) v případě Žádný. Zde je opravený kód:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Výstup: V tomto pevném kódu je funkce lambda vrátí seznam obsahující x * 2 -li 'X' je větší než 0. Jestliže 'X' není větší než 0 (jako v případě -1), vrátí prázdný seznam. Nyní můžeme opakovat výsledek, aniž bychom narazili na „NoneType“ chyba.