- 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). |
A class szó magyarázatát lásd itt: Típusosság#A Python típusai egyúttal osztályok is.
| |
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, variable → except SomeException as variable
|
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: