Kako odpraviti napako TypeError: predmeta »NoneType« v Pythonu ni mogoče ponoviti

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)>

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




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




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.

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.

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.