Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Modulok és csomagok


A programozásban a modul egy olyan szoftverdarab, amelynek meghatározott funkciója van. Például, amikor egy ping pong játékot készítünk, az egyik modul a játéklogikáért lehet felelős, míg egy másik modul a játékot rajzolja a képernyőre. Minden modul egy külön fájlból áll, amelyet külön lehet szerkeszteni.

Writing modules

A Python modulok csak .py kiterjesztésű Python fájlok. A modul neve ugyanaz, mint a fájl neve. Egy Python modul tartalmazhat meghatározott és megvalósított függvények, osztályok vagy változók halmazát. A fenti példa két fájlt tartalmaz:

mygame/

  • mygame/game.py

  • mygame/draw.py

A game.py Python szkript megvalósítja a játékot. Használja a draw_game függvényt a draw.py fájlból, vagy más szavakkal, a draw modulból, amely megvalósítja a játék képernyőn való megjelenítésének logikáját.

A modulok más modulokból az import paranccsal importálhatók. Ebben a példában a game.py szkript valahogy így nézhet ki:

# game.py
# importáljuk a draw modult
import draw

def play_game():
    ...

def main():
    result = play_game()
    draw.draw_game(result)

# ez azt jelenti, hogy ha ezt a szkriptet futtatjuk, akkor 
# a main() is fog futni
if __name__ == '__main__':
    main()

A draw modul valahogy így nézhet ki:

# draw.py

def draw_game():
    ...

def clear_screen(screen):
    ...

Ebben a példában a game modul importálja a draw modult, amely lehetővé teszi a benne megvalósított függvények használatát. A main függvény a helyi play_game függvényt használja a játék futtatásához, majd a játék eredményét a draw modulban megvalósított draw_game nevű függvénnyel rajzolja ki. A draw modul draw_game függvényének használatához meg kell adnunk, melyik modulban van megvalósítva a függvény, a pont operátor használatával. A game modul draw_game függvényére való hivatkozáshoz importálnunk kell a draw modult, majd meghívni a draw.draw_game() függvényt.

Amikor az import draw utasítás lefut, a Python interpreter megkeresi a szkript futtatásának könyvtárában azt a fájlt, amelynek neve megegyezik a modul nevével, és .py végződésű. Ebben az esetben a draw.py fájlt. Ha megtalálja, importálja. Ha nem találja meg, tovább keres a beépített modulok között.

Észrevehetted, hogy amikor egy modult importálsz, létrejön egy .pyc fájl. Ez egy fordított Python fájl. A Python bytekódra fordítja a fájlokat, így nem kell minden alkalommal elemezni a fájlokat, amikor betöltődnek a modulok. Ha létezik .pyc fájl, az töltődik be a .py fájl helyett. Ez a folyamat átlátható a felhasználó számára.

Importing module objects to the current namespace

Egy névtér egy olyan rendszer, ahol minden objektum el van nevezve és elérhető a Pythonban. A fő szkript névterébe importáljuk a draw_game függvényt a from parancs használatával.

# game.py
# importáljuk a draw modult
from draw import draw_game

def main():
    result = play_game()
    draw_game(result)

Észrevehetted, hogy ebben a példában a modul neve nem előzi meg a draw_game-et, mert a modul nevét megadtuk az import paranccsal.

Ennek a jelölésnek az előnye, hogy nem kell újra és újra hivatkozni a modulra. Viszont egy névtér nem tartalmazhat két azonos nevű objektumot, ezért az import parancs lecserélheti a névtérben már létező objektumot.

Importing all objects from a module

Az összes objektum importálásához egy modulból használhatjuk az import * parancsot így:

# game.py
# importáljuk a draw modult
from draw import *

def main():
    result = play_game()
    draw_game(result)

Ez egy kicsit kockázatos lehet, mivel a modul változásai befolyásolhatják az azt importáló modult, de rövidebb, és nem szükséges megadni minden egyes objektumot, amelyet importálni akarunk a modulból.

Custom import name

A modulok bármilyen név alatt betölthetők, amit csak akarunk. Ez hasznos lehet, amikor feltételesen importálunk egy modult, hogy ugyanazt a nevet használjuk a kód többi részében.

Például, ha két draw modulunk van kissé eltérő nevekkel, megtehetjük a következőt:

# game.py
# importáljuk a draw modult
if visual_mode:
    # vizuális módban grafikát használunk rajzolásra
    import draw_visual as draw
else:
    # szöveges módban szöveget jelenítünk meg
    import draw_textual as draw

def main():
    result = play_game()
    # ez lehet vizuális vagy szöveges attól függően, hogy visual_mode van beállítva
    draw.draw_game(result)

Module initialization

Egy modul első betöltésekor egy futó Python szkriptbe az inicializálás úgy történik, hogy a modulban lévő kód egyszer végrehajtódik. Ha a kódodban egy másik modul újra importálja ugyanazt a modult, nem fog újra betöltődni, így a modulban lévő helyi változók "szingletonként" működnek, vagyis csak egyszer inicializálódnak.

Ezeket ezután felhasználhatod objektumok inicializálására. Például:

# draw.py

def draw_game():
    # amikor a képernyőt tisztítjuk, használhatjuk a fő képernyő objektumot, amely ebben a modulban van inicializálva
    clear_screen(main_screen)
    ...

def clear_screen(screen):
    ...

class Screen():
    ...

# inicializáljuk a main_screen-t mint szingleton
main_screen = Screen()

Extending module load path

Van néhány módja annak, hogy megmondjuk a Python interpreternek, hol keressen modulokat az alapértelmezett helyi könyvtáron és a beépített modulokon kívül. Használhatod a PYTHONPATH környezeti változót, hogy további könyvtárakat adj meg, mint például:

PYTHONPATH=/foo python game.py

Ez futtatja a game.py-t, és lehetővé teszi a szkript számára, hogy modulokat töltsön be a foo könyvtárból, valamint a helyi könyvtárból.

Az sys.path.append függvényt is használhatod. Futtasd ezt azelőtt, hogy az import parancsot kiadnád:

sys.path.append("/foo")

Most a foo könyvtár hozzá lett adva azon utak listájához, ahol a modulokat keresik.

Exploring built-in modules

Nézd meg a Python szabványos könyvtárban található beépített modulok teljes listáját itt.

Két nagyon fontos függvény támogathatja a modulok felfedezését Pythonban - a dir és a help függvények.

Az urllib modul importálásához, amely lehetővé teszi számunkra, hogy URL-ekről adatokat olvassunk, importáljuk a modult:

# importáljuk a könyvtárat
import urllib

# használjuk
urllib.urlopen(...)

Megvizsgálhatjuk, hogy mely függvények vannak megvalósítva minden egyes modulban a dir függvény használatával:

>>> import urllib
>>> dir(urllib)
['ContentTooShortError', 'FancyURLopener', 'MAXFTPCACHE', 'URLopener', '__all__', '__builtins__', 
'__doc__', '__file__', '__name__', '__package__', '__version__', '_ftperrors', '_get_proxies', 
'_get_proxy_settings', '_have_ssl', '_hexdig', '_hextochr', '_hostprog', '_is_unicode', '_localhost', 
'_noheaders', '_nportprog', '_passwdprog', '_portprog', '_queryprog', '_safe_map', '_safe_quoters', 
'_tagprog', '_thishost', '_typeprog', '_urlopener', '_userprog', '_valueprog', 'addbase', 'addclosehook', 
'addinfo', 'addinfourl', 'always_safe', 'basejoin', 'c', 'ftpcache', 'ftperrors', 'ftpwrapper', 'getproxies', 
'getproxies_environment', 'getproxies_macosx_sysconf', 'i', 'localhost', 'main', 'noheaders', 'os', 
'pathname2url', 'proxy_bypass', 'proxy_bypass_environment', 'proxy_bypass_macosx_sysconf', 'quote', 
'quote_plus', 'reporthook', 'socket', 'splitattr', 'splithost', 'splitnport', 'splitpasswd', 'splitport', 
'splitquery', 'splittag', 'splittype', 'splituser', 'splitvalue', 'ssl', 'string', 'sys', 'test', 'test1', 
'thishost', 'time', 'toBytes', 'unquote', 'unquote_plus', 'unwrap', 'url2pathname', 'urlcleanup', 'urlencode', 
'urlopen', 'urlretrieve']

Amikor megtaláljuk a modult, amelyet használni szeretnénk, többet olvashatunk róla a help függvény segítségével a Python interpretert használva:

help(urllib.urlopen)

Writing packages

A csomagok névterek, amelyek több csomagot és modult tartalmaznak. Ezek csak könyvtárak, de bizonyos követelményekkel.

Minden Python csomagnak tartalmaznia KELL egy speciális fájlt __init__.py néven. Ez a fájl, amely lehet üres is, jelzi, hogy a könyvtár, amelyben tartózkodik, egy Python csomag. Így importálható ugyanolyan módon, mint egy modul.

Ha létrehozunk egy foo nevű könyvtárat, amely a csomag nevét jelöli, akkor létrehozhatunk egy modult ebben a csomagban bar néven. Ezután hozzáadjuk a __init__.py fájlt a foo könyvtárba.

A bar modul használatához kétféleképpen importálhatjuk:

import foo.bar

vagy:

from foo import bar

Az előző példában a foo előtagot kell használnunk, valahányszor hozzáférünk a bar modulhoz. A második példában erre nincs szükség, mert a modult a saját modulunk névterébe importáltuk.

A __init__.py fájl azt is eldöntheti, mely modulok exportálhatók a csomag API-jaként, miközben más modulokat belső célokra tartanak meg, az __all__ változó felülírásával, például:

__init__.py:

__all__ = ["bar"]

Exercise

Ebben a gyakorlatban nyomtass egy ábécérendbe rendezett listát az összes re modulbeli függvényről, amelyek tartalmazzák a find szót.

import re # Your code goes here find_members = [] import re # Your code goes here find_members = [] for member in dir(re): if "find" in member: find_members.append(member) print(sorted(find_members)) test_object('find_members') success_msg('Great work!')

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy