Python je priljubljen in vsestranski programski jezik, vendar kot kateri koli drug jezik lahko povzroča napake, ki jih je lahko neprijetno odpraviti. Ena od pogostih napak, s katerimi se srečujejo razvijalci, je TypeError: Objekta »NoneType« ni mogoče ponoviti. V tem članku bomo raziskali različne scenarije, v katerih lahko pride do te napake, in ponudili praktične rešitve, ki vam bodo pomagale pri učinkovitem reševanju te napake.
Razumevanje napake: objekt NoneType ni Iterable
Sporočilo o napaki TypeError: Objekta »NoneType« ni mogoče ponoviti v Python se običajno pojavi, ko poskušate ponoviti objekt, ki ima vrednost Noben . Ta napaka se sproži, ker None ni ponovljiv, kar pomeni, da se ne morete pomikati po njem kot pri seznamih, tulpih ali drugih ponovljivih predmetih.
sintaksa: TypeError: objekta 'NoneType' ni mogoče ponoviti
Vzroki za TypeError: Objekta 'NoneType' ni mogoče ponoviti
- Manjka izjava o vračilu
- Neveljaven odziv API-ja
- Ponavljanje po spremenljivki z vrednostjo Brez
- Brez Napaka v vrsti v razredih
- Lambda funkcije in napaka NoneType
Manjka izjava o vračilu
Eden najpogostejših scenarijev, ki vodijo do te napake, je manjkajoč stavek return v funkciji. Recimo, da imamo funkcijo, ki naj bi vrnila a seznam števil, vendar pozabimo vključiti povratni stavek:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
polje v metodah java
>
>
Izhod
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 za num v rezultatu: 7 print(num) TypeError: objekta 'NoneType' ni mogoče ponoviti>
V tem primeru, ' generiraj_števila()' ne vrne ničesar, kar pomeni, da vrne None. Ko poskušamo ponoviti rezultat, bomo naleteli na ' TypeError' ker ne moremo ponavljati čez None.
Rešitev: Zagotovite pravilno vračilo
Če želite odpraviti to napako, poskrbite, da naša funkcija vrne pričakovano vrednost. V tem primeru bi morali dodati stavek return 'generate_numbers()':
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Izhod
1 2 3 4 5>
zdaj, generiraj_števila() vrne seznam številk in napaka je odpravljena.
Neveljaven odziv API-ja
Drug scenarij, kjer lahko naletite na to napako, je pri delu z API-ji . Recimo, da naredimo zahtevo API za pridobivanje podatkov, vendar API vrne None namesto pričakovanih podatkov:
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)> |
>
>
Izhod
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 za element v podatkih: 12 print(item) TypeError: objekta 'NoneType' ni mogoče ponoviti>
Če je API zahteva ne uspe ali vrne nič, bomo prejeli a 'TypeError' pri poskusu ponavljanja podatkov.
Rešitev: Preverite odziv API-ja
Da bi rešili to situacijo, bi morali preveriti odziv API-ja, preden ga poskušamo ponoviti. Tukaj je izboljšana različica kode:
Python3
celo število v niz v Javi
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)> |
>
>
Če statusna koda ni 200, to pomeni, da je prišlo do težave z API prošnja. V tem primeru vrnemo prazen seznam [] kot nadomestno vrednost namesto Brez. Vrnitev praznega seznama nam omogoča, da se izognemo 'NoneType' napaka pri poskusu ponavljanja podatkov o odgovoru pozneje v kodi.
Ponavljanje po spremenljivki z vrednostjo Brez
Ta scenarij je preprost in pogost. Pojavi se, ko poskušamo narediti zanko (iteracijo) čez spremenljivko, ki ima vrednost Brez:
Python3
optični bralnik naslednji
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Izhod
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 za element na mojem_seznamu: 3 print(item) TypeError: objekta 'NoneType' ni mogoče ponoviti>
V tem scenariju spremenljivka ' moj_seznam' je nastavljeno na Brez. Ko se zanka for poskuša ponoviti 'my_list' , naleti na TypeError: Objekta »NoneType« ni mogoče ponoviti. Do te napake pride, ker None ni predmet, ki ga je mogoče ponoviti, in se ne moremo pomikati po njem.
Rešitev: Zagotavljanje prisotnosti Iterable pred zanko
Da bi odpravili to napako, moramo to zagotoviti 'my_list' vsebuje predmet, ki ga je mogoče ponoviti (kot je seznam, tuple itd.), preden ga poskusite ponoviti. Dodajanje potrditvenega všečka če my_list ni None pred zanko zagotavlja, da se koda znotraj zanke izvaja samo if moj_seznam ni Noben, preprečuje 'NoneType' napaka.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
Brez Napaka v vrsti v razredih
Razredi v Python lahko tudi naletijo 'NoneType' napake, zlasti pri delu z metodami, ki vrnejo None. Razmislite o razredu z metodo, ki ne vrne nobene vrednosti.
Recimo, da imamo razred z imenom 'Študent'. V tem razredu želimo shraniti ime študenta in njegove ocene. Razred ima metodo, imenovano 'get_grades()' ki bi po logiki morala vrniti študentove ocene. V tej situaciji študent z imenom ' Alisha' se ustvari s seznamom ocen. Namen je preveriti, ali je katera od Alishinih ocen višja ali enaka 90, in jo natisniti
Tukaj je začetna koda:
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)> |
>
>
Izhod
--------------------------------------------------------------------------- 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 za oceno v student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: objekta 'NoneType' ni mogoče ponoviti> Težava je v 'get_grades()' metoda. Čeprav natisne ocene, jih ne vrne. Ko poskušamo preskočiti 'student.get_grades()' , natisne ocene, vendar vam ne da nobenih vrednosti, s katerimi bi delali v zanki.
Torej, ko poskušamo ponoviti rezultat 'student.get_grades()', implicitno vrača 'Brez' ker ni izrecne izjave o vračilu v 'get_grades()' metoda. Python upošteva to None, kar ni mogoče ponoviti. Posledično naletimo na a TypeError: Objekta »NoneType« ni mogoče ponoviti napaka.
Rešitev: vrnitev ustreznih vrednosti iz metod razreda
Za rešitev te težave moramo spremeniti 'get_grades()' metoda. Namesto samo tiskanja ocen, bi jih morala vrniti. Vrnitev ocen pomeni zagotavljanje iterable (v tem primeru seznama ocen) klicalcu metode. Z vrnitvijo ocen postane metoda ponovljiva in zanka lahko deluje, kot je predvideno.
int v nizu
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)> |
>
>
Torej v tej popravljeni kodi je 'get_grades()' metoda vrne 'samostojna ocena', ki je seznam ocen. Ko ponovimo 'student.get_grades()' , bomo pregledali seznam ocen in jih ne bo 'NoneType' napaka, ker ponavljamo čez veljaven objekt, ki ga je mogoče ponoviti.
Izhod
90 92>
Lambda funkcije in napaka NoneType
Napaka TypeError: Objekta »NoneType« ni mogoče ponoviti se lahko pojavi v lambda funkcije ko funkcija lambda v določenih situacijah vrne None. To se običajno zgodi, ko pogojno vrnemo None za določene vhodne vrednosti. Ko poskušamo ponoviti rezultat funkcije lambda, ki vrne None, naletimo na to napako.
cm do stopal in palcev
primer: V tem primeru, če je vnos x ni večji od 0 (x>0) , the lambda funkcija vrne None. Ko poskušamo ponoviti rezultat, poskušamo ponoviti None, kar povzroči TypeError: Objekta »NoneType« ni mogoče ponoviti napaka.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Izhod
--------------------------------------------------------------------------- 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 rezultat = my_lambda(-1) ----> 3 za element v rezultatu: 4 print(item) TypeError: 'NoneType' objekta ni mogoče ponoviti>
Rešitev: Zagotavljanje ponovljivih rezultatov
Da bi odpravili to napako, bi morali obravnavati primer, ko funkcija lambda vrne None. Eden od načinov za obravnavo je zagotoviti privzeto iterable (kot je prazen seznam) v primeru Noben. Tukaj je popravljena koda:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Izhod: V tej fiksni kodi je lambda funkcija vrne seznam, ki vsebuje x * 2 če 'x' je večji od 0. Če 'x' ni večji od 0 (kot v primeru -1), vrne prazen seznam. Zdaj lahko ponovimo rezultat, ne da bi naleteli na 'NoneType' napaka.