Ügyességi játékok programozása
Pythonnal és Pygame-mel

Chapter 14: Könyvtárak és modulok

fig.example_sprite_game

A könyvtár nem más, mint függvények és osztályok kódgyűjteménye. Általában ezeket a könyvtárakat valaki más írta, és így nem kell állandóan feltalálnunk a kereket. A Pythonban ezt a szót arra használjuk, hogy egy kód könyvtárat nevezzünk meg, amiben modulok vannak.

Az import pygame és az import random, amiket már használtunk a programjaink során, szintén modulokat használnak. Egy könyvtár többféle modult tartalmazhat, amit lehet importálni. Gyakran egy könyvtárban egy modul van, így ezek a szavak felcserélhetők a legtöbb esetben.

A modulok gyakran vannak hasonló funkció alapján csoportba fogva. Ebben a tananyagban mi is használtunk már függvényeket, a math modulból, a random modulból és a pygame könyvtárból. A modulokat így lehet szervezni, hogy egyes modulok más modulokat is tartalmazzanak. Például, a pygame könyvtár tartalmaz olyan alkönyvtárakat, hogy pygame.draw, pygame.image, és pygame.mouse.

A modulokat nem töltjük be, egészen addig, amíg a program nem kéri. Ez időt takarít meg a számítógép memóriájában. Ez a fejezet azt mutatja meg, hogyan alkoss meg egy modult, és hogyan importáld azt, amikor használni akarod.

14.1 Minek hozzunk létre könyvtárakat?

Három okunk lehet programozóként megalkotni a saját könyvtárunkat:

  1. A kódot kisebb, könnyebben használható részekre tudjuk szedni
  2. Több embernek is lehetővé teszi, hogy dolgozzanak a programon.
  3. A kódot könnyebb megosztani más programozóval.

Néhány általunk írt program is jócskán hosszabb lenne. Egy nagy programot elkülöníteni kisebb programokra, könnyebb lesz a kódot kezelni. Például, az előző fejezetben, a sprite példáknál, a sprite osztályt a programozó akár külön fájlban is tárolhatná. Egy komplexebb programban minden sprite-nak saját fájlja lenne.

Ha több programozó dolgozik ugyanazon a projekten, akkor szinte lehetetlen ha minden kód egy fájlban van. Azontúl a programot több fájlba tördelni még könnyebben áttekinthetővé is teszi azt. Egy programozó például csak az "Ork" sprite osztályon dolgozik. Egy másiknak meg csak a "Goblin" sprite osztály maradna, Mivel a sprite-ok különböző fájlokban vannak a programozók nem kerülnek egymással konfliktusba.

Modern programozók már ritkán építenek fel programot vázlatból. Általában olyan programokat építenek, amik más programok részei, és hasonlóan működnek. Ha egy programozó olyan kódot ír, ami képes a hitelfelvételi eljárás formanyomtatványát kezelni, akkor az a kód ideális lesz egy könyvtárban. Azután bármely programozó meghívhatja majd, ha ilyenre lesz szüksége.

14.2 Saját modulod/könyvtárad fájl létrehozása:

Videó: Könyvtárak

Ebben a példában részeire szedünk egy rövid programot, ami több fájlból áll. Elsőnek itt van a test.py függvényünk, és ahogy meghívjuk:

# ufó függvény
def foo():
    print ("ufó!")

# ufó hívása
foo()

Igen, ez a program nem túl hosszú és egy fájlban van benne. De ha mind a függvény és mind a főprogram hosszú lenne, akkor már más lenne a helyzet. Ha sok függvényünk van, mindegyik 100 sor hosszú, akkor már az is időt vesz igénybe, ahogyan kezeljük a fájlt. De ebben a példában a kódot röviden tartjuk áttekinthetőségért.

Használhatjuk az ufó függvényt a fájlon kívül is. Ekkor a fájlt ott kell hagynunk a főprogram mellett. (A példában erre nincs okunk, hogy külön kezeljük őket, csak a tanulás kedvéért tesszük.)

Ahhoz, hogy ezt megtegyük, készítsünk egy új fájlt és másoljuk bele az ufó függvényt. Mentsük el az új fájlt my_functions.py néven. Ugyanabba a könyvtárba tegyük lehetőleg, ahol a test.py fájl van.

# ufó függvény
def foo():
    print ("ufó!")
# Az ufó meghívása, ahogyan nem működik
foo()

Sajnos ez nem ilyen egyszerű. A test.py fájl nem tudja, hogy ezt a my_functions.py-ból kell neki meghívnia. Nekünk kell importálnunk:

# A my_functions.py fájl importálása
import my_functions

# Az ufó hívása, és még mindig nem működik
foo()

Még mindig nem működik. Mi hiányzik? Ugyanúgy, ahogyan a pygame-t importáljuk, bele kell tennünk a csomag nevét a függvénybe. Mint itt:

# Importálom a my_functions.py fájlt
import my_functions

# Az ufó hívása, ahogyan MÁR működik
my_functions.foo()

Ez azért működik, mivel a my_functions előtag szükséges a függvény meghívásához.

14.3 Névtartomány

Videó: Névtartomány

Egy programnak kétféle könyvtár fájlt kellene használnia. Mi van akkor, ha vannak olyan könyvtárak, amelyekben a függvények neve ugyanaz? Mi van akkor, ha két függvényt neveztünk el print_report-nak, ahol az egyik kiírja az osztályzatot, a másik meg a számlát? Például:

def print_report():
    print ("Diákok osztályzatának jelentése:" )
def print_report():
    print ("Pénzügyi jelentés:" )

Honnan tudja a program, hogy melyik függvényt hívtuk meg? Nos, ez könnyű. Meg kell adnod a névtartományt. A névtartománynak meg kell jelennie a függvény neve előtt, mint a lenti kódban:

import student_functions
import financial_functions

student_functions.print_report()
financial_functions.print_report()

Nos, már láthatod, hogy miért van erre szükség. De mi van akkor, ha nincs névütközés? Állandóan gépelgetni a neveket elég fárasztó. Megteheted ennek a könnyítését, ha a helyi névtartományba importálod be a könyvtárat. A helyi névtartomány az osztályok, függvények és változók listája, melyeknél nem kell megadnod a névtartományt. Menjünk vissza az ufós példára, töröljük az eredeti importot és helyettesítsük egy új típusú importtal:

# ufó importálása
from my_functions import *

foo()

Ez működni fog anélkül is, hogy a my_functions-t hozzáadnénk a függvény hívásához. A csillag egy joker-lap, amivel minden függvény le tudunk hívni a my_functions-ből. Egy programozó képes egyenként is meghívni a kívánt függvényeket.

14.4 Harmadik fél könyvtárai

Amikor Pythonban dolgozunk, lehetőség van arra, hogy sokféle könyvtárat használjunk, amit már korábban létrehoztak. Vess egy pillantást a könyvtárakra, melyek elérhetőek innen:
http://docs.python.org/3/py-modindex.html

Lehetőség van arra, hogy letöltsünk és installáljunk más könyvtárakat. Vannak könyvtárak, melyek a webbel, a komplex számokkal, adatbázisokkal és egyebekkel dolgoznak.

A Python könyvtárak csodás listája és azok installjainak linkjei itt érhető el:
http://www.lfd.uci.edu/~gohlke/pythonlibs/

Ha átlapozod a könyvtárak listáit, akkor lehetővé válik számodra, hogy legyen valami gyors képed arról, milyen programokat lehet létrehozni. A legtöbb program alkotásakor nagy részeket illesztünk össze, ahelyett, hogy mident vázlatból írnánk meg.

14.5 Áttekintés

14.5.1 Kvízkérdések

Click here for a multiple-choice quiz.

14.5.2 Feladatlap

Click here for the chapter worksheet.

14.5.3 Labor feladat

Click here for the chapter lab.


You are not logged in. Log in here and track your progress.