Python az iskolában Wiki
Advertisement
E szócikk elolvasása előtt érdemes tanulmányozni a Verziók cikket!

Az interneten és olykor a könyvekben számtalan olyan mintakódot találunk, amelyiknek a leírásából nem derül ki, melyik verzióban készült. Inkompatibilitás egyedül a 3.x és a 2.x között léphet fel (azonos fő verziószámon belül nem). A nyelvvel most ismerkedőknek a Python legfrissebb verzióját érdemes munkába fogniuk, de a 2.x-es kódok kis munkával átalakíthatóak hármas verzióra. Mivel a kettes verzió netes irodalma egyelőre sokkal nagyobb, ezért szükségünk lehet erre a tudásra. Néhány tanács a verzió felismeréséhez, a teljesség igénye nélkül:

Szimptóma Teendő
Megijedtél, mert 2.x-es kódot találtál, amit bemásolva hibaüzeneteket kapsz működő program helyett. Ne ijedj meg! Nem olyan sok az eltérés, hogy ne tudnád akár kezdő szinten is kijavítani a legtöbb kódot. Megéri a munkát. Olvasd tovább a táblázatot, és töltsd le a lap aljáról a puskát.
A kódban print vagy exec utasítás van zárójel nélkül. Az értelmező szintaktikai hibát jelez. A kód 2.x-es. Tegyük ki a zárójeleket, a 3.x-ben a print és az exec függvény lett. (Az utolsó kettes verziók már felismerték a zárójelet, amit előrelátó programozók használtak is, ezért a zárójel megléte önmagában nem garantálja, hogy hármas verziójú kódot látunk.)


Az ékezetes vagy más nem angol betűs stringek idézőjele előtt u betű van (u"Árvíztűrő"). Az értelmező szintaktikai hibát jelez. A kód 2.x-es. Vegyük le az u betűket, nem kellenek. A hármas verzióban a Unicode a stringkezelés alapja.


A kódban raw_input beviteli függvény van. A kód 2.x-es. Egyszerűen cseréljük inputra. A régi input kiértékelést is végzett, ezt viszont a 3.x-ben az eval(input()) csinálja.
Egyes egész számok után l vagy L betű van (pl. 4517L). A kód 2.x-es. Vegyük le az L betűt, nem kell. A 2.x-ben az int adattípus 32 bites előjeles egész volt, a long pedig tetszőlegesen hosszú. A 3.x-ben megszűnt a régi int, helyette a régi long típust nevezik intnek, tehát minden egész szám szükségletei szerint részesülhet a tárhelyből. Ezzel együtt nyugállományba vonult a sys.maxint.
A kódban <> a "nem egyenlő" jele. Az értelmező szintaktikai hibát jelez. A kód 2.x-es. Cseréljük !=-re.
A futás típushibával áll le. Lehet, hogy egyszerűen csak rossz a program, de az is lehet, hogy a 3.x-ben nem támogatott implicit konverziót használ.


A map() vagy a filter() függvény használatakor típushibát kapunk. Ezek a függvények a 2.x-ben listát adnak vissza, a 3.x-ben iterátort, amelyet pl. a list függvény használatával alakíthatunk listává vagy ciklussal dolgozhatunk fel. A legegyszerűbb az egészet beburkolni egy list()-be.
Osztás során a program típushibával áll le. A kettes verzióban a / osztásjel az operandusoktól függően viselkedett, az eredménye egész vagy lebegőpontos szám lehetett, ezért pl. páros szám felezésekor ott is használható volt, ahol az értelmező egész számot vár. A hármas verzióban a / eredménye mindig float, a // padlós osztás eredménye int vagy float típusú lesz. A padlós osztás a hányados egészrészét szolgáltatja, tehát mindig lefelé kerekít. Ha az a hibaüzenet, hogy egész számot várt az értelmező, és lebegőpontosat kapott, akkor próbáljuk a törtvonalat kettős törtvonalra cserélni (valószínűleg a régi kód is akkor adott helyes eredményt, ha nem kellett a törtrésszel foglalkozni).
Osztás (2.5)   Osztás3

A class szó magyarázatát lásd itt: Típusosság#A Python típusai egyúttal osztályok is.

  • Példa: a VPython mintaprogramjai közül a Cherry tree futtatása során először inkonzisztensen használt tabulátorokra és szóközökre panaszkodik az értelmező, majd – ennek javítása után – hibás lebegőpontos számot jelez a 85. sorban. Cseréljük a for i in range(len(leaves)/20): programsorban a / jelet //-re, mert a range egész számot vár, és gyönyörűen futni fog! Megéri. :-)
A programozó nyolcbites számokat tárolt szöveges változóban, és emiatt futásidejű hibát kapunk. bytes vagy bytearray típust kellene használnunk. Hasonlítsd össze a bitmap.py jelenlegi változatát a laptörténetben elérhető 2.5-össel, abból látszik a megoldás.
Az értelmező nem találja a standard könyvtár egy modulját. Ellenőrizzük az alanti listában a nevet.


Szintaktikai hiba van a kivételkezelésben a raise vagy except utasítást tartalmazó sorban. Valószínűleg 2.x-es a kód, javítsuk eszerint:

except SomeException, variableexcept SomeException as variable
raise Exception, argsraise Exception(args)

Puska[]

Mark Summerfield (ld. még vele kapcsolatban a Könyvek szócikket) készített egy kiváló négyoldalas puskát, amely angol nyelven letölthető innen:

Advertisement