ID.nl logo
Zo kun je programmeren in Python - deel 8
© Reshift Digital
Zekerheid & gemak

Zo kun je programmeren in Python - deel 8

Tot nu toe leerde je heel wat mogelijkheden van de programmeertaal Python. Misschien ben je buiten onze lessen zelf al aan de slag gegaan met je kennis. Super, want programmeren leer je door het veel te doen. Maar een goed programma is ook gedocumenteerd en goed getest. Dat leer je in onze achtste les.

Hier vind je les 1 van de Python-cursus.

Verkeerde gewoontes leer je niet snel af, daarom dat we nu even een stapje terugdoen en nadenken over wat ‘goede code’ is. Na deze les kun je code produceren die niet alleen goed gedocumenteerd en goed getest is, maar weet je ook hoe je informatie over Python-modules opzoekt met de helpfunctie.

Code documenteren met commentaar

Tot nu toe schreven we onze code zonder enige vorm van documentatie. Als je met anderen samenwerkt aan een programma, is het belangrijk dat je die documenteert, zodat je anderen duidelijk maakt wat je met je code bedoelt. Maar ook als je helemaal alleen programmeert, is documentatie geen overbodige luxe. Zo begrijp je je eigen code nog als je er over een jaar opnieuw naar kijkt.

De eerste manier om je code te documenteren is met commentaar. Alles na het #-teken (hekje) tot het einde van de regel (behalve als het hekje ín een string voorkomt) is commentaar en wordt door Python genegeerd. Op die manier kun je een uitleg voor jezelf of anderen schrijven. Als je bijvoorbeeld in de functie is_palindroom van deel 6 in de war raakt met die indexen, schrijf er dan gerust wat commentaar bij:

if letters[0] != letters[-1]: # Als de eerste en de laatste letter verschillen

Het getuigt van goede stijl om twee spaties tussen je code en het erna volgende commentaarteken te houden en één spatie tussen het commentaarteken en je commentaar. Overigens kun je ook commentaar op een nieuwe losstaande regel beginnen, dan spreken we van een commentaarregel:

# Als de eerste en de laatste letter verschillen

if letters[0] != letters[-1]:

Het is de gewoonte om een commentaarregel te zetten op de regel vóór de regel waarover hij gaat.

Code uitcommentariëren

Het commentaarteken (#) wordt ook weleens gebruikt om code die je aan het testen bent maar die niet blijkt te werken tijdelijk ‘uit te commentariëren’ ofwel uit te zetten. Door een commentaarteken voor de code te zetten, wordt de code door Python genegeerd, maar kun je hem erna wel eenvoudig weer inschakelen door het commentaarteken weg te halen. Op deze manier gebruik je het commentaarteken dus niet voor documentatie, maar eigenlijk als hulpmiddel bij het debuggen.

Code documenteren met docstrings

Commentaar gebruik je om te documenteren waarom je iets doet en hoe je het doet, maar voor gebruikers van je code is vooral belangrijk wat die doet. Om dat te documenteren, gebruik je docstrings: in het begin van elke module, elke klasse en elke functie of methode geef je met een string tussen drie dubbele aanhalingstekens aan wat het stuk code doet.

Zo zouden we onze klassen uit de vorige les als volgt kunnen documenteren:

"""Klassen om met tweedimensionale, driedimensionale en hogerdimensionale punten te werken."""

import math

class Point:
"""Stelt een punt voor in een willekeurig aantal dimensies."""

def __init__(self, *coordinates):
"""Initialiseer het punt met de opgegeven coördinaten."""
self.coordinates = list(coordinates)

def __repr__(self):
"""Geef een leesbare voorstelling van het punt terug."""
return 'Point(' + ', '.join(str(co) for co in self.coordinates) + ')'

def displacement(self, other_point):
"""Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

Voorbeeld: het verschil tussen Point(1, 4, 2) en Point(3, 4, 1) is gelijk aan Point(2, 0, -1).
"""
return Point(*[a-b for a, b in zip(other_point.coordinates, self.coordinates)])

def distance(self, other_point):
"""Geef de Euclidische afstand terug tussen dit punt en een ander punt."""
relative_position = self.displacement(other_point)
return math.sqrt(sum(i**2 for i in relative_position.coordinates))
class Point2D(Point):
"""Stelt een tweedimensionaal punt voor."""

def __init__(self, x=0, y=0):
"""Initialiseer het punt met de opgegeven x- en y-coördinaten."""
Point.__init__(self, x, y)
self.x = x
self.y = y
def get_x(self):

"""De x-coördinaat van het punt."""
return self.coordinates[0]

def set_x(self, x):
self.coordinates[0] = x

x = property(get_x, set_x)

def get_y(self):
"""De y-coördinaat van het punt."""
return self.coordinates[1]

def set_y(self, y):
self.coordinates[1] = y

y = property(get_y, set_y)

Je ziet hier dat documentatie niet lang hoeft te zijn. De docstrings bij de module, de klassen en bij de meeste methodes zijn maar één regel lang.

De moeilijkste methode om te begrijpen is displacement en daarom is het zinvol om daar wat meer uitleg bij te geven. Bij een docstring van meer dan één regel raden we aan om na de eerste regel een lege regel te houden, en om de drie dubbele aanhalingstekens op het einde op een nieuwe regel te zetten. Dat geeft wat meer overzicht.

Merk op: bij onze eigenschappen x en y van de klasse Point2D documenteren we alleen de methode die de waarde van de eigenschap opvraagt. Zo toont de ingebouwde helpfunctie van Python (die we op het einde van deze les bespreken) deze documentatie bij de eigenschap.

Interactieve voorbeelden in docstrings

We hebben in de docstring van de methode displacement al een voorbeeld van het gebruik van de methode gegeven als documentatie. Maar dat bleef nogal informeel. We kunnen die documentatie ook in de vorm van echte Python-code doen die je in een interactieve terminalsessie zou kunnen invoeren. Zo kan de gebruiker die de documentatie leest, onmiddellijk de voorbeelden kopiëren uit de documentatie en plakken in de Python-interpreter om ze uit te proberen. Dat zou voor de methode displacement er dan als volgt uitzien:

def displacement(self, other_point):"""Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

>>> Point(1, 4, 2).displacement(Point(3, 4, 1))Point(2, 0, -1)"""return Point(*[a-b for a, b in zip(other_point.coordinates, self.coordinates)])

Je ziet hier dat je de code na de >>> exact in een Python-terminalsessie zou kunnen invoeren en dan ook het resultaat zou krijgen dat hier staat. In feite hebben we wat hier staat gewoon eerst in de terminal van Thonny ingevoerd en dan samen met de uitvoer gekopieerd en hier in de docstring geplakt.

Code testen met doctest

Stel dat je nu ooit de code van de methode displacement aanpast omdat je denkt een verbetering te zien, maar er een fout in maakt, waardoor het resultaat verkeerd is. Dan kun je dat testen door de voorbeeldcode in je docstring uit te voeren in een Python-terminalsessie. Voer je de code uit en komt het resultaat niet overeen met de uitvoer in de docstring, dan klopt je code niet meer.

Maar zouden we die test niet automatisch kunnen doen? Jazeker! Python kent daarvoor de module doctest, die automatisch alle docstrings in een module kan testen op interactieve voorbeelden. Dat voer je als volgt uit in een Linux- of macOS-terminal of de Windows Opdrachtprompt:

python3 -m doctest -v point.py

Hierbij is point.py de naam van de module met je code erin. Je krijgt dan als uitvoer de tests die doctest in je docstrings ziet en het resultaat. Als je het alleen wilt zien als een test een fout vindt, haal dan de optie -v weg. Stel dat je bijvoorbeeld per ongeluk de * vergeten bent in de methode displacement om de lijst naar een willekeurig aantal argumenten voor de klasse Point om te zetten, dan zal doctest die fout opmerken met de volgende melding:

**********************************************************************

File "point.py", line 21, in point.Point.displacement

Failed example:

Point(1, 4, 2).displacement(Point(3, 4, 1))

Expected:

Point(2, 0, -1)

Got:

Point([2, 0, -1])

**********************************************************************

1 items had failures:

1 of

***Test Failed*** 1 failures.

Een goede manier van programmeren is dan ook dat je je code zoveel mogelijk documenteert met docstrings en daarin ook interactieve voorbeelden opneemt, die je na elke wijziging van je code automatisch test met doctest om je ervan te verzekeren dat je geen fouten hebt geïntroduceerd.

De helpfunctie gebruiken

Als je code is gedocumenteerd, hoef je niet je codebestand in Thonny te openen om de documentatie te bekijken. Je kunt dit in een interactieve Python-sessie, bijvoorbeeld in Thonny, maar ook in een Python-sessie in een Linux- of macOS-terminal of de Windows Opdrachtprompt. Het enige wat je hoeft te doen, is de functie help op te roepen met de naam van de module, klasse, functie of methode waarvoor je de documentatie wilt zien. Bijvoorbeeld in Thonny:

>>> help(Point.displacement)

Help on function displacement in module __main__:

displacement(self, other_point)

Geef het verschil terug tussen dit punt en een ander punt.

De overeenkomstige coördinaten worden van elkaar afgetrokken.

>>> Point(1, 4, 2).displacement(Point(3, 4, 1))

Point(2, 0, -1)

Overigens zijn alle standaardmodules van Python uitgebreid gedocumenteerd met docstrings. Daardoor kun je van alle modules, klassen, functies en methodes heel eenvoudig documentatie opvragen in je Python-terminalsessie. Let er wel op dat je een module eerst dient te importeren voordat je er documentatie van kunt opvragen met help.

Samenvatting

In deze les ging het minder over het programmeren zelf, maar over het documenteren en testen van je Python-programma’s en het uitzoeken van meer informatie over de standaard Python-modules of je eigen modules. Hoe complexer je programma’s zijn, hoe belangrijker dit soort zaken rond je code zijn. Maak er daarom een gewoonte van om documentatie en tests niet als een nabeschouwing te zien, maar al tijdens de ontwikkeling van je programma in je code te integreren. In de volgende les maken we het nog complexer: dan gaan we extra modules installeren die niet in Python ingebouwd zijn.

Opdracht 1

Voer de helpfunctie eens uit op je klasse Point2D. Wat zou er nog beter kunnen aan de getoonde documentatie?

Uitwerking opdracht 1

*>>> from point import Point2D

help(Point2D)* De helpfunctie van onze klasse toont niet alleen de eigenschappen x en y bij de Data descriptors, maar toont ook de methodes get_x, set_x, get_y en set_y. Dat is wat te veel van het goede. Die methodes hoeven niet getoond te worden. Daar doen we in de volgende opdracht iets aan.

Opdracht 2

We hebben een eigenschap zoals x in de klasse Point2D tot nu toe geconstrueerd met methodes get_x en set_x en een opdracht als x = property(get_x, set_x) om deze methodes samen als eigenschap te gebruiken. Maar je kunt een eigenschap ook met een decorator definiëren en dan worden die methodes niet in de helpuitvoer getoond. Zoek zelf met de ingebouwde helpfunctie van Python op hoe je dat doet.

Uitwerking opdracht 2

Met help(property) krijg je uitleg over de opdracht property. Je leert er zelfs dat het geen opdracht maar een klasse is. Het in de helpuitvoer getoonde voorbeeld kun je bijna rechtstreeks toepassen op onze klasse Point2D. Dan kom je tot de volgende code voor x: *@propertydef x(self):"""De x-coördinaat van het punt."""return self.coordinates[0]@x.setter**def x(self, x):*self.coordinates[0] = x Doe hetzelfde voor y. Voer de helpfunctie opnieuw uit op je klasse en verifieer dat je alleen nog maar hulp over de eigenschappen krijgt en niet meer over de methodes die de eigenschappen opbouwen.

Cheatsheet

Commentaar: een regel die begint met # en dient als uitleg bij een stukje code. Debuggen: fouten (bugs) in je code opsporen en verhelpen. Docstring: een string tussen drie dubbele aanhalingstekens die een module, klasse, functie of methode documenteert. Uitcommentariëren: een regel code uitschakelen door er een commentaarteken voor te zetten.

▼ Volgende artikel
CES 2026: Acer vernieuwt Predators en Nitro's met Intel Core Ultra 3 en RTX 50-chips
© Acer
Huis

CES 2026: Acer vernieuwt Predators en Nitro's met Intel Core Ultra 3 en RTX 50-chips

Toe aan een nieuwe dikke laptop om de nieuwste games op te kunnen spelen? Dat komt goed uit, want Acer heeft op de CES in Las Vegas een aantal nieuwe krachtpatsers geïntroduceerd waarmee je jouw spelletjes voortaan rustig met de hoogste settings kunt aanslingeren.

Acer heeft zijn portfolio gaminglaptops uitgebreid met de Predator Helios Neo 16S AI en nieuwe Nitro-modellen. De apparaten zijn uitgerust met de nieuwste Intel Core Ultra Series 3-processors en NVIDIA RTX 50-videokaarten. Daarnaast introduceert de fabrikant nieuwe randapparatuur, waaronder een headset en muis. De nieuwe producten worden in het tweede kwartaal verwacht in de Benelux.

Slanke krachtpatser

Het vlaggenschip van deze aankondiging is de Predator Helios Neo 16S AI (model PHN16S-I51). Onder de motorkap huisvest deze laptop maximaal een Intel Core Ultra 9-processor (386H) gecombineerd met een NVIDIA GeForce RTX 5070-laptop-GPU. Visueel onderscheidt het apparaat zich door een 16-inch oledpaneel met een WQXGA-resolutie, wat moet zorgen voor een hoog contrast en diepe zwartwaarden.

Ondanks de krachtige hardware blijft de behuizing relatief compact met een dikte van 18,9 millimeter. Om de temperaturen binnen deze beperkte ruimte onder controle te houden, maakt Acer gebruik van een koelsysteem met 'vloeibaar metaal' als koelpasta en een vijfde generatie AeroBlade-ventilator. Daarnaast beschikt de laptop over de nodige moderne connectiviteitsopties zoals wifi 6E en Thunderbolt 4, en biedt hij ruimte voor maximaal 64 GB DDR5-geheugen.

©Acer

Vernieuwing in Nitro-lijn

Naast het premiumsegment werkt Acer ook de meer toegankelijke Nitro-serie bij met twee nieuwe modellen: de Nitro V 16 AI en de slankere Nitro V 16S AI. Beide laptops ondersteunen tot een Intel Core Ultra 7-processor en dezelfde NVIDIA GeForce RTX 50-serie GPU's die in de duurdere modellen te vinden zijn. Het voornaamste verschil zit 'm in de bouw en schermtechnologie; waar de Predator gebruikmaakt van oled, houden de Nitro-modellen het bij WUXGA-resolutie schermen met een verversingssnelheid van 180 Hz. De V 16S AI is met een chassis van minder dan 1,8 centimeter dik lekker draagbaar. Beide modellen zijn voorzien van een RGB-toetsenbord met vier zones en een fysieke privacysluiter voor de webcam.

©Acer

Ook hier nadruk op AI

Een terugkerend thema in deze generatie laptops is de integratie van specifieke hardware voor AI. Alle aangekondigde modellen dragen het label 'Copilot+ PC', wat in dit geval betekent dat er een Neural Processing Unit (NPU) aanwezig is die meer dan 45 biljoen operaties per seconde (TOPS) kan uitvoeren. Deze hardware biedt ondersteuning voor specifieke Windows 11-functies, zoals Live Captions voor realtime vertalingen en tools voor beeldgeneratie, zonder de centrale processor zwaar te belasten. Acer bundelt hierbij zijn eigen softwarepakket (genaamd Acer Intelligence Space) om alle AI-functies te beheren en prestaties te optimaliseren.

Nieuwe draadloze randapparatuur

Naast de laptops introduceert Acer randapparatuur om je setup compleet te maken. De Predator Galea 570 is een draadloze headset met 50mm-drivers en Environmental Noise Cancellation (ENC) om achtergrondgeluid tijdens communicatie weg te filteren. Voor de invoer is er de Predator Cestus 530-gamingmuis, gebouwd rondom een PixArt PAW3395-sensor die een gevoeligheid tot 26.000 dpi ondersteunt. Opvallend is dat de muis een 'polling rate' van 8000 Hz ondersteunt in bedrade modus, wat theoretisch zorgt voor een snellere registratie van bewegingen in vergelijking met de standaard 1000 Hz bij veel reguliere muizen. Beide apparaten bieden flexibele verbindingsmogelijkheden, waarbij gebruikers kunnen schakelen tussen 2,4 GHz draadloos, bluetooth en een bedrade verbinding via usb.

©Acer

Nog even geduld...

Consumenten in de Benelux kunnen de nieuwe apparaten in het tweede kwartaal van dit jaar verwachten. Acer heeft bevestigd dat de Predator Helios Neo 16S AI, de Nitro V 16 AI en de Nitro V 16S AI vanaf die periode leverbaar zullen zijn. Hoewel de technische specificaties al tot in detail zijn vrijgegeven, zijn de exacte adviesprijzen voor de Benelux nog niet bekendgemaakt. Die zullen afhangen van de specifieke configuraties, zoals de hoeveelheid werkgeheugen en opslagruimte, die per verkoopkanaal kunnen verschillen.

▼ Volgende artikel
CES 2026: ASUS introduceert krachtige mini-pc's voor AI en gaming op CES 2026
© ASUS | Edited with Google AI
Huis

CES 2026: ASUS introduceert krachtige mini-pc's voor AI en gaming op CES 2026

Op elektronicabeurs CES in Las Vegas heeft ASUS vier nieuwe mini-pc's laten zien. De compacte computers moeten meer rekenkracht bieden voor kunstmatige intelligentie en zware grafische taken, maar nemen nauwelijks ruimte in op een bureau.

De nieuwe modellen - ASUS NUC 16 Pro, ExpertCenter PN55, ROG GR70 en Ascent GX10 - draaien op de nieuwste Intel- en AMD-processors. Daarmee mikt ASUS met deze pc's op mensen die hun computer intensief gebruiken, maar ook op gamers die een krachtig systeem willen dat weinig ruimte inneemt.

De ASUS NUC 16 Pro draait op een Intel Core Ultra X9 Series 3-processor en haalt tot 180 TOPS (trillion operations per second), bijna het dubbele van zijn voorganger. Hij ondersteunt snel LPDDR5x-geheugen, heeft twee 2.5G-netwerkaansluitingen en is uitgerust met WiFi 7 en Bluetooth 6.0. De behuizing is stevig gebouwd en getest om hitte, kou en trillingen te weerstaan. Zijn afmetingen? 144 x 117 x 42mm - ongeveer zo groot als een half pak suiker.

De ASUS ExpertCenter PN55 richt zich op gebruikers die een kleine maar complete werk-pc willen. Binnenin zit een AMD Ryzen AI 400-processor met geïntegreerde Radeon 800M-graphics en een aparte chip voor AI-taken tot 55 TOPS. De PN55 ondersteunt Copilot+ in Windows en heeft veel aansluitingen, waaronder zes USB-poorten en twee netwerkaansluitingen. Ook zijn er WiFi 7, Bluetooth 5.4, een vingerafdruksensor en een ingebouwde microfoon voor spraakbediening.

Voor gamers is er de ROG GR70, de eerste mini-pc van ASUS onder het ROG-label. Hij combineert een AMD Ryzen 9-processor met een NVIDIA GeForce RTX 5070- of RTX 5060-grafische kaart. Volgens ASUS levert hij prestaties die vergelijkbaar zijn met een desktop, maar dan in een veel kleinere behuizing (282mm x 187mm x 56 mm). Een drievoudig koelsysteem houdt de onderdelen koel en het geluid beperkt.

De ASUS Ascent GX10 is de krachtigste van de vier. Deze kleine CoPilot+ desktop gebruikt de NVIDIA GB10 Grace Blackwell Superchip met 128 GB geheugen en kan volgens ASUS rekenprestaties op het niveau van datacenters leveren. De GX10 kan zelfstandig draaien of gekoppeld worden aan een tweede systeem voor lokale AI-training of modelontwikkeling.

Beschikbaarheid

Prijzen en releasedata zijn nog niet bekend. ASUS verwacht de nieuwe mini-pc's later in 2026 uit te brengen.

Wat betekent TOPS?

TOPS staat voor trillion operations per second en geeft aan hoeveel berekeningen een chip per seconde kan uitvoeren. Bij AI-toepassingen, zoals spraakherkenning of beeldanalyse, is een hoger aantal TOPS een maatstaf voor snellere verwerking en betere prestaties bij machine learning-taken.

©ID.nl