TypeError-korjaus: NoneType-objekti ei ole iteroitavissa Pythonissa
Python on suosittu ja monipuolinen ohjelmointikieli, mutta kuten mikä tahansa muu kieli, se voi aiheuttaa virheitä, jotka voivat olla turhauttavia virheenkorjauksessa. Yksi yleisimmistä kehittäjien kohtaamista virheistä on TypeError: NoneType-objekti ei ole iteroitavissa. Tässä artikkelissa tutkimme erilaisia skenaarioita, joissa tämä virhe voi ilmetä, ja tarjoamme käytännön ratkaisuja, joiden avulla voit ratkaista sen tehokkaasti.
Virheen ymmärtäminen: NoneType' -objekti ei ole iteroitavissa
Virheilmoitus TypeError: NoneType-objekti ei ole iteroitavissa sisään Python tapahtuu tyypillisesti, kun yrität iteroida objektia, jonka arvo on Ei mitään . Tämä virhe ilmenee, koska None ei ole iteroitavissa, mikä tarkoittaa, että et voi kiertää sitä samalla tavalla kuin listojen, monikoiden tai muiden iteroitavien objektien kanssa.
syntaksi: TypeError: NoneType-objekti ei ole iteroitavissa
TypeErrorin syyt: NoneType-objekti ei ole iteroitavissa
- Palautusilmoitus puuttuu
- Virheellinen API-vastaus
- Iteroidaan muuttujan yli, jonka arvo on Ei mitään
- Ei mitään Kirjoita virhe luokissa
- Lambda-funktiot ja NoneType-virhe
Palautusilmoitus puuttuu
Yksi yleisimmistä tähän virheeseen johtavista skenaarioista on puuttuva return-lause funktiosta. Oletetaan, että meillä on funktio, jonka oletetaan palauttavan a lista numeroista, mutta unohdamme sisällyttää palautuslausekkeen:
Python 3
def> generate_numbers():> > numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> > # Missing return statement> result> => generate_numbers()> for> num> in> result:> > print> (num)> |
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 tulosten lukumäärälle: 7 print(num) TypeError: 'NoneType' -objekti ei ole iteroitavissa
Tässä tapauksessa, ' gener_numbers()' ei palauta mitään, mikä tarkoittaa, että se palauttaa Ei mitään. Kun yritämme toistaa tulosta, kohtaamme ' Tyyppivirhe' koska emme voi toistaa Ei mitään.
Ratkaisu: Varmista oikea palautus
Korjaa tämä virhe varmistamalla, että funktiomme palauttaa odotetun arvon. Tässä esimerkissä meidän pitäisi lisätä return-lause 'generate_numbers()':
Python 3
def> generate_numbers():> > numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> > return> numbers> result> => generate_numbers()> for> num> in> result:> > print> (num)> |
Lähtö
1 2 3 4 5
Nyt, genero_numerot() palauttaa numeroluettelon, ja virhe on korjattu.
Virheellinen API-vastaus
Toinen skenaario, jossa saatat kohdata tämän virheen, on työskentely API:t . Oletetaan, että teemme API-pyynnön tietojen hakemiseksi, mutta API palauttaa Ei mitään odotettujen tietojen sijaan:
Python 3
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)> |
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 kohteelle tiedoissa: 12 print(item) TypeError: 'NoneType' objekti ei ole iteroitavissa>>Jos API pyyntö epäonnistuu tai palauta Ei mitään, saamme a 'Tyyppivirhe' kun yrität iteroida dataa.
Ratkaisu: Tarkista API-vastaus
Tämän tilanteen ratkaisemiseksi meidän tulee tarkistaa API-vastaus ennen kuin yritämme toistaa sitä. Tässä on parannettu versio koodista:
Python 3
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)> |
Jos tilakoodi ei ole 200, se tarkoittaa, että sovelluksessa on ongelma API pyyntö. Tässä tapauksessa palautamme tyhjän luettelon [] paikkamerkkiarvona Ei mitään. Tyhjän luettelon palauttaminen antaa meille mahdollisuuden välttää 'NoneType' virhe yritettäessä toistaa vastausdataa myöhemmin koodissa.
Iteroidaan muuttujan yli, jonka arvo on Ei mitään
Tämä skenaario on suoraviivainen ja yleinen. Se tapahtuu, kun yritämme toistaa (iteroida) muuttujan, jonka arvo on Ei mitään:
Python 3
my_list> => None> for> item> in> my_list:> > print> (item)> |
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 kohteelle my_list: 3 print(item) TypeError: 'NoneType' objekti ei ole iteroitavissa
Tässä skenaariossa muuttuja ' Minun listani' on asetettu arvoon Ei mitään. Kun for-silmukka yrittää iteroida uudelleen 'Minun listani' , se kohtaa TypeError: NoneType-objekti ei ole iteroitavissa. Tämä virhe ilmenee, koska None ei ole iteroitavissa oleva objekti, emmekä voi kiertää sitä.
Ratkaisu: Iterable läsnäolon varmistaminen ennen silmukoita
Korjataksemme tämän virheen, meidän on varmistettava se 'Minun listani' sisältää iteroitavan objektin (kuten luettelon, tuplen jne.) ennen kuin yrität iteroida sen yli. Lisää sekin tykkää jos listani ei ole Ei mitään ennen silmukkaa varmistaa, että silmukan sisällä oleva koodi suoritetaan vain jos Minun listani ei ole Ei mitään, mikä estää 'NoneType' virhe.
Python 3
my_list> => None> if> my_list> is> not> None> :> > for> item> in> my_list:> > print> (item)> |
Ei mitään Kirjoita virhe luokissa
Luokat sisään Python voi myös kohdata 'NoneType' virheitä, varsinkin käytettäessä menetelmiä, jotka palauttavat Ei mitään. Harkitse luokkaa, jonka menetelmä ei palauta arvoa.
Oletetaan, että meillä on luokka nimeltä 'Opiskelija'. Tällä luokalla haluamme tallentaa oppilaan nimen ja arvosanat. Luokassa on menetelmä nimeltä 'get_grades()' jonka loogisesti pitäisi palauttaa opiskelijan arvosanat. Tässä tilanteessa opiskelija nimeltä ' Alisha' luodaan arvosanaluettelolla. Tarkoituksena on tarkistaa, onko jokin Alishan arvosanoista suurempi tai yhtä suuri kuin 90, ja tulostaa ne
Tässä alkuperäinen koodi:
Python 3
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>>> |