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>>>:> >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>>>:> >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>>> 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>>> []> 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.