logo

Kā labot TypeError: objekts “NoneType” nav atkārtojams Python

Python ir populāra un daudzpusīga programmēšanas valoda, taču, tāpat kā jebkura cita valoda, tā var radīt kļūdas, kuru atkļūdošana var būt apgrūtinoša. Viena no izplatītākajām kļūdām, ar ko saskaras izstrādātāji, ir TypeError: objekts “NoneType” nav atkārtojams. Šajā rakstā mēs izpētīsim dažādus scenārijus, kuros šī kļūda var rasties, un sniegsim praktiskus risinājumus, kas palīdzēs jums to efektīvi novērst.

Izpratne par kļūdu: NoneType objekts nav atkārtojams

Kļūdas ziņojums TypeError: objekts “NoneType” nav atkārtojams iekšā Python parasti notiek, mēģinot atkārtot objektu, kura vērtība ir Nav . Šī kļūda tiek parādīta, jo None nav atkārtojams, kas nozīmē, ka jūs nevarat to cilpot tāpat kā ar sarakstiem, kortežām vai citiem iterējamiem objektiem.



sintakse: TypeError: objekts “NoneType” nav atkārtojams

TypeError cēloņi: objekts “NoneType” nav atkārtojams

  • Trūkst atgriešanas paziņojuma
  • Nederīga API atbilde
  • Iterācija pār mainīgo ar vērtību None
  • Nav Ierakstiet kļūdu klasēs
  • Lambda funkcijas un NoneType kļūda

Trūkst atgriešanas paziņojuma

Viens no visizplatītākajiem scenārijiem, kas izraisa šo kļūdu, ir funkcijā trūkstošs atgriešanas paziņojums. Pieņemsim, ka mums ir funkcija, kurai ir jāatgriež a sarakstu no skaitļiem, bet mēs aizmirstam iekļaut atgriešanās paziņojumu:

Python3








def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

>

Izvade

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 rezultātu skaitam: 7 print(num) TypeError: 'NoneType' objekts nav atkārtojams>

Šajā gadījumā, ' gener_numbers()' neko neatgriež, kas nozīmē, ka tas atgriež Nav. Mēģinot atkārtot rezultātu, mēs saskarsimies ar ' Type Error' jo mēs nevaram atkārtot par Nav.

Risinājums: nodrošiniet pareizu atgriešanu

Lai labotu šo kļūdu, pārliecinieties, vai funkcija atgriež paredzamo vērtību. Šajā piemērā mums jāpievieno atgriešanas paziņojums 'generate_numbers()':

Python3




java lietotāja ievade

def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

>

Izvade

1 2 3 4 5>

Tagad ģenerēt_skaitļus() atgriež skaitļu sarakstu, un kļūda tiek novērsta.

Nederīga API atbilde

Vēl viens scenārijs, kurā jūs varētu saskarties ar šo kļūdu, ir, strādājot ar API . Pieņemsim, ka mēs veicam API pieprasījumu, lai iegūtu datus, bet API paredzēto datu vietā atgriež Neviens:

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

>

>

Izvade

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 vienumam datos: 12 print(item) TypeError: 'NoneType' objekts nav atkārtojams>

Ja API pieprasījums neizdodas vai atgriež Nav, mēs saņemsim a 'Type Error' mēģinot atkārtot datus.

Risinājums: pārbaudiet API atbildi

Lai risinātu šo situāciju, mums ir jāpārbauda API atbilde, pirms mēģināt to atkārtot. Šeit ir uzlabota koda versija:

Python3




mest izņēmumu apstrādi java
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)>

>

>

Ja statusa kods nav 200, tas nozīmē, ka radās problēma ar API pieprasījumu. Šajā gadījumā mēs atgriežam tukšu sarakstu [] kā viettura vērtību, nevis None. Tukša saraksta atgriešana ļauj mums izvairīties no 'NoneType' kļūda, mēģinot atkārtot atbildes datus vēlāk kodā.

Atkārtojas mainīgā ar vērtību None

Šis scenārijs ir vienkāršs un izplatīts. Tas notiek, kad mēs cenšamies veikt cilpu (iterēt) pār mainīgo, kura vērtība ir Nav:

Python3




my_list>=> None> for> item>in> my_list:> >print>(item)>

>

kaut kas priekš bfs
>

Izvade

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 vienumam my_list: 3 print(item) TypeError: 'NoneType' objekts nav atkārtojams>

Šajā scenārijā mainīgais ' mans_saraksts' ir iestatīts uz Nav. Kad for cilpa mēģina atkārtot 'mans_saraksts' , tā saskaras ar TypeError: objekts “NoneType” nav atkārtojams. Šī kļūda rodas, jo None nav atkārtojams objekts, un mēs nevaram to pārvietot.

Risinājums: Iterable klātbūtnes nodrošināšana pirms cilpas

Lai labotu šo kļūdu, mums tas ir jānodrošina 'mans_saraksts' satur iterējamu objektu (piemēram, sarakstu, virkni utt.), pirms mēģināt to atkārtot. Pievienojot čeku patīk ja mans_saraksts nav Nav pirms cilpas nodrošina, ka kods cilpas iekšpusē darbojas tikai tad, ja mans_saraksts nav Neviens, novēršot 'NoneType' kļūda.

Python3




my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)>

>

>

Nav Ierakstiet kļūdu klasēs

Klases iekšā Python var arī saskarties 'NoneType' kļūdas, īpaši, strādājot ar metodēm, kas atgriež Nav. Apsveriet klasi ar metodi, kas neatgriež nekādu vērtību.

javatpoint java

Pieņemsim, ka mums ir klase ar nosaukumu 'Students'. Šajā klasē mēs vēlamies saglabāt skolēna vārdu un atzīmes. Klasei ir metode, ko sauc “get_grades()” kam, loģiski, būtu jāatgriež skolēna atzīmes. Šajā situācijā students vārdā ' Alisha' ir izveidots ar atzīmju sarakstu. Nolūks ir pārbaudīt, vai kāds no Alisha atzīmēm ir lielāks vai vienāds ar 90, un izdrukāt tos

Šeit ir sākotnējais kods:

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

>

>

Izvade

--------------------------------------------------------------------------- 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 atzīmei student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' objekts nav atkārtojams>

Problēma slēpjas tajā “get_grades()” metodi. Lai gan tas izdrukā atzīmes, tas tās neatgriež. Kad mēs cenšamies cilpu cauri 'student.get_grades()' , tas drukā atzīmes, bet nesniedz nekādas vērtības, ar kurām strādāt cilpas laikā.

Tātad, kad mēs mēģinām atkārtot rezultātu “student.get_grades()”, tas netieši atgriežas 'Nav' jo nav skaidra atgriešanās paziņojuma “get_grades()” metodi. Python uzskata šo Nav, kas nav atkārtojams. Rezultātā mēs sastopamies ar a TypeError: objekts “NoneType” nav atkārtojams kļūda.

Risinājums: atbilstošo vērtību atgriešana no klases metodēm

Lai atrisinātu šo problēmu, mums ir jāmaina “get_grades()” metodi. Tā vietā, lai tikai drukātu atzīmes, tai vajadzētu tās atgriezt. Atzīmju atgriešana nozīmē atkārtojamības (šajā gadījumā atzīmju saraksta) nodrošināšanu metodes izsaucējam. Atgriežot atzīmes, metode kļūst iterējama, un cilpa var darboties, kā paredzēts.

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

>

>

Tātad šajā labotajā kodā “get_grades()” metode atgriežas “self.grade”, kas ir atzīmju saraksts. Kad mēs atkārtojam 'student.get_grades()' , mēs atkārtosim atzīmju sarakstu, un tāda nebūs 'NoneType' kļūda, jo mēs atkārtojam derīgu iterējamu objektu.

Izvade

90 92>

Lambda funkcijas un NoneType kļūda

Kļūda TypeError: objekts “NoneType” nav atkārtojams var rasties lambda funkcijas kad lambda funkcija noteiktās situācijās atgriež Nav. Tas parasti notiek, ja noteiktām ievades vērtībām nosacīti atgriežam Nav. Mēģinot atkārtot lambda funkcijas rezultātu, kas atgriež Nav, mēs saskaramies ar šo kļūdu.

ārijas khans

Piemērs: Šajā piemērā, ja ievade x nav lielāks par 0 (x>0) , lambda funkcija atgriež Nav. Kad mēs cenšamies atkārtot rezultātu, mēs cenšamies atkārtot, salīdzinot ar Nav, izraisot TypeError: objekts “NoneType” nav atkārtojams kļūda.

Python3




my_lambda>=> lambda> x: x>*> 2> if> x>>>else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

Izvade

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 cits Nav 2 rezultāts = my_lambda(-1) ----> 3 vienumam rezultātā: 4 print(item) TypeError: 'NoneType' objekts nav atkārtojams>

Risinājums: atkārtojamu rezultātu nodrošināšana

Lai labotu šo kļūdu, mums vajadzētu rīkoties gadījumā, kad lambda funkcija atgriež Nav. Viens veids, kā to rīkoties, ir nodrošināt noklusējuma iterējamu (piemēram, tukšu sarakstu) gadījumā Nav. Šeit ir izlabotais kods:

Python3




my_lambda>=> lambda> x: [x>*> 2>]>if> x>>>else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

Izvade: Šajā fiksētajā kodā lambda funkcija atgriež sarakstu, kurā ir x * 2 ja 'x' ir lielāks par 0. Ja 'x' nav lielāks par 0 (tāpat kā -1 gadījumā), tas atgriež tukšu sarakstu. Tagad mēs varam atkārtot rezultātu, nesaskaroties ar 'NoneType' kļūda.