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