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.