Python packages en modules

Op deze pagina:

Packages zijn directories met Python bestanden met daarbij een __init__.py bestand. Dit __init__.py bestand maakt van een "gewone" directory een Python package.

Een __init__.py bestand mag helemaal leeg zijn, maar je mag er ook Python code in plaatsen. Deze Python code kun modules importeren zodat je dat niet meer afzonderlijk in je hoofdscript hoeft te doen.

Python packages en modules kun je gebruiken om je code logisch te organiseren. Dit is vooral handig als je Python project wat groter wordt en je niet het risico wilt lopen dat je door de bomen het bos niet meer ziet. Het gebruik van packages en modules maakt je code ook beter onderhoudbaar en je kunt je gemaakte functionaliteit eenvoudig hergebruiken.

Een Python package kan ook zelf weer packages bevatten, subpackages dus, net als je in een bestandssysteem subdirectories hebt. Elk subpackage moet ook weer een eigen __init__.py hebben.

Elk Python bestand in een package is een module. Je kunt een module importeren door de modulenaam vooraf te laten gaan door de packagenaam en een punt:


import packagenaam.modulenaam

Als het om een module van een subpackage gaat:


import packagenaam.Subpackagenaam.modulenaam

De extensie .py hoef je er niet bij te zetten.

Om niet elke keer als je de module nodig hebt die volledige naam te hoeven typen, kun een alias gebruiken:


import packagenaam.Subpackagenaam.modulenaam as module1

Een functie gebruiken uit deze module kan dan met:


module1.mijnfunctie()

Om mijnfunctie() rechtstreeks te kunnen gebruiken, dus zonder dat je er steeds module1. voor moet plakken, moet je de functie expliciet importeren:


from packagenaam.Subpackagenaam.modulenaam import mijnfunctie()

Ook hier kun je, als je dat wilt, weer een alias gebruiken:


from packagenaam.Subpackagenaam.modulenaam import mijnfunctie() as mijnfun()

Als je een package importeert, dan worden eventuele subpackages niet automatisch mee geimporteerd. Deze moet je afzonderlijk importeren.

Waar Python naar modules zoekt

Als je een module importeert, dan gaat Python op zoek naar deze module in de huidige directory, dat is de directory waar het hoofdscript is gestart. Als de module daar niet gevonden kan worden, dan gaat Python zoeken in de directories die in de environment variabele PYTHONPATH staan aangegeven. In welke directories Python zoekt kun je opvragen via de Python variabele sys.path, hiervoor moet je de module sys importeren:


import sys

print(sys.path)

Om te zorgen dat je module gevonden wordt kun je het script plaatsen in de directory waar het hoofdscript staat, of in een subdirectory daarvan in een package. Je kunt ook een directory die een package is met modules toevoegen aan de environment variabele PYTHONPATH.

Voorkomen dat opdrachten in een module worden uitgevoerd bij importeren

Een module is ook een python script. Om te voorkomen dat opdrachten in dit script worden uitgevoerd tijdens het importeren kun je de opdrachten onder een dunder main plaatsen:


if (__name__ == ‘__main__’):
     print(‘dit wordt alleen geprint als dit script zelfstandig wordt gestart en niet als het als een module wordt geimporteerd')

De classes en functies die boven de dunder main staan worden wel geimporteerd.

Alles is niet alles

Alle modules in een package importeren kan met:


from package import *  

Echter, je moet dan wel in __init__.py opgeven wat "alles" is:


__all__ = ["module1", "module2", "module3"]

Als dit ontbreekt, dan wordt er niets geïmporteerd.

 

Verwante artikelen