Werkboek — Hoofdstuk 9: Modules en virtuele omgevingen
Let op: alle programmacode schrijf je in het Engels (zoals in het boek). De uitleg en opdrachten zijn in het Nederlands.
Doel van dit hoofdstuk
- Werken met modules en pakketten (packages) en deze importeren.
- Het importpad (
sys.path) begrijpen en het__name__ == "__main__"-patroon toepassen. - Een mini-tour door de standaardbibliotheek (math, random, datetime, pathlib).
- Basisgebruik van
pipen virtuele omgevingen (conceptueel/uitvoering buiten dit document). - Veelvoorkomende valkuilen vermijden (naamconflicten, star-imports, verkeerde werkdirectory).
Richtlijnen
- Gebruik expliciete imports (
import packageoffrom package import name), vermijdfrom module import *. - Schrijf duidelijke, Engelstalige modulenaam- en functienamen.
- Voor CLI-voorbeelden: voeg waar zinvol een
if __name__ == "__main__":-blok toe. - Voor oefeningen met
pip/venv: schrijf de commando’s en voorbeeldcode; uitvoeren doe je lokaal in je eigen omgeving.
Oefening 1 — Eigen module importeren (temperature)
Maak temperature.py met twee functies:
c_to_f(c: float) -> floatf_to_c(f: float) -> floatSchrijf een apart scriptapp.pydatfrom temperature import c_to_f, f_to_cgebruikt en twee voorbeelden print.
Oefening 2 — import module vs. from module import name
Schrijf twee varianten van een script dat math.pi print:
- met
import mathen gebruikmath.pi; - met
from math import pien gebruikpi. Schrijf kort in een comment wat het praktische verschil is in gebruik/namespace.
Oefening 3 — __name__ == "__main__"
Breid temperature.py uit met een __main__-blok dat een optionele command-line parameter leest (sys.argv[1] als Celsius, anders 0.0) en de Fahrenheit-waarde print. Test door het bestand direct te runnen.
Oefening 4 — Het importpad bekijken
Schrijf show_path.py dat alle paden in sys.path print (één per regel). Run het script vanuit verschillende werkdirectories en observeer de eerste entries. Noteer in comments wat je ziet.
Oefening 5 — Eenvoudig package: calc/
Maak een map calc/ met:
__init__.py(mag leeg, of exporteeradd,subvia__all__).ops.pymet functiesadd(a, b),sub(a, b),mul(a, b),div(a, b)(gooiZeroDivisionErrorbijb == 0). Schrijfmain.pydatfrom calc.ops import add, divgebruikt en twee voorbeelden print.
Oefening 6 — Relatieve import binnen package
Voeg in calc/cli.py een functie main() toe die from .ops import add gebruikt en python -m calc.cli als aanroeppad ondersteunt (lees optioneel twee getallen uit sys.argv).
Oefening 7 — Vermijd star-import
Gegeven deze slechte regel: from math import *.
- Herschrijf naar een expliciete import (kies relevante namen of gebruik
import math). - Leg in een comment in 1 zin uit waarom
*onwenselijk is.
Oefening 8 — Standaardbibliotheek mini-taken Schrijf één script met drie korte voorbeelden:
random.choice(["red","green","blue"])en print het resultaat.datetime.now().isoformat(timespec="seconds")en print het.- Controleer met
pathlib.Path("notes.txt").exists()of het bestand bestaat en print een boodschap.
Oefening 9 — Derde-partij module (pip) — conceptueel
Schrijf de commando’s die je zou uitvoeren in een venv om requests te installeren (niet daadwerkelijk uitvoeren hier):
- aanmaken/activeren venv;
python -m pip install requests;python -m pip freeze > requirements.txt. Schrijf infetch.pyvoorbeeldcode diehttps://httpbin.org/getophaalt met een timeout en statuscode print. Voeg een comment toe dat dit in een geactiveerde venv hoort te draaien.
Oefening 10 — Naamconflict met standaardbibliotheek
Maak een bestand random.py met een eigen functie foo(). Probeer in een ander script import random; print(random.choice([1,2,3])). Observeer de fout (of het verkeerde gedrag). Hernoem jouw bestand (bijv. myrandom.py) en laat zien dat het probleem verdwijnt. Schrijf in comments de verklaring.
Uitdaging (optioneel) — Klein greet-package met CLI
Maak een package greet/ met __init__.py en cli.py:
- In
__init__.py: functiehello(name: str) -> stren eventueel__all__ = ["hello"]. - In
cli.py:main()die een naam uitsys.argvleest enhelloprint. Toon hoe jepython -m greet.cli Avakunt gebruiken (bij juistePYTHONPATHof na installatie in een venv).