ID.nl logo
Zo kun je programmeren in Python - Deel 10
© Reshift Digital
Huis

Zo kun je programmeren in Python - Deel 10

Tot nu toe leerden we je programmeren, maar we leerden je geen programma schrijven. Het verschil? Programmeren doe je voor jezelf; een programma schrijven voor iemand anders. Je wilt dat een gebruiker eenvoudig een programma kan oproepen met opties, een mooi resultaat te zien krijgt en ook hulp kan opvragen als hij niet weet hoe hij jouw programma moet gebruiken. Dat alles zien we in deze laatste les van Python.

In deze tiende les ronden we stilaan af. Tot nu toe leerde je allerlei aspecten van Python kennen en die brengen we in deze les allemaal samen. Op het einde van deze les heb je een programma dat je op de opdrachtregel kunt uitvoeren, dat argumenten afhandelt, foutmeldingen geeft en tekst in kleur toont.

Argumenten op de opdrachtregel

In les 3 al leerde je om invoer van de gebruiker te vragen met de functie input. En hoewel we ons programma daar in Thonny uitvoerden, vertelden we daar ook al dat je het programma in Windows, Linux of macOS ook op de opdrachtregel kunt uitvoeren met:

python3 naamvanprogramma.py

Maar van programma’s op de opdrachtregel verwachten we dat je er ook argumenten aan kunt doorgeven, zoals DIR /s in Windows of ls -R in Linux en macOS. Hoe zorgen we dat onze eigen programma’s dat ook kunnen? Daar heeft Python gelukkig een oplossing voor met de module argparse in de standaardbibliotheek. In deze les schrijven we een programma dat de module palindroom uit les 6 gebruikt om van woorden te controleren of ze een palindroom zijn, en dat programma gaan we enkele argumenten geven.

Argumenten toevoegen

Als eerste willen we dat het programma ons vertelt of een woord dat we als argument aan het programma doorgeven een palindroom is. Dat ziet er zo uit:

from argparse import ArgumentParser

from palindroom import is_palindroom

parser = ArgumentParser(description='Bepaal of een woord een palindroom is.')

parser.add_argument("-w", "--woord", required=True, help="Het woord waarvan je wilt controleren of het een palindroom is")

args = parser.parse_args()

resultaat = is_palindroom(args.woord)

if resultaat:

print("Het woord '{}' is een palindroom.".format(args.woord))

else:

print("Het woord '{}' is geen palindroom.".format(args.woord))

Je ziet dat met argparse werken niet zo moeilijk is. Je maakt eerst een ArgumentParser-object aan met de beschrijving van je programma. Daarna voeg je een argument toe (in ons geval in een korte versie -w en een lange versie --woord) en lees je met parser.parse_args() de argumenten uit die de gebruiker op de opdrachtregel ingegeven heeft. De inhoud van het argument --woord vind je dan in de variabele args.woord.

Heel wat functionaliteit

Voer het programma nu eens uit:

$ python3 palindroomchecker.py -w parterretrap

Het woord 'parterretrap' is een palindroom.

$ python3 palindroomchecker.py -w parterretrak

Het woord 'parterretrak' is geen palindroom.

Merk op: we krijgen heel wat functionaliteit ‘gratis’ omdat argparse die voor ons uitvoert. Zo krijg je een foutmelding als je na -w geen woord opgeeft of als je het programma zonder het argument -w uitvoert (omdat we het argument toegevoegd hebben met required=True). En we krijgen ook het argument --help er gratis bij. Als je dit opgeeft, toont het programma de beschrijving van je programma en van alle argumenten die je gedefinieerd hebt:

$ python3 palindroomchecker.py -w

usage: palindroomchecker.py [-h] -w WOORD

palindroomchecker.py: error: argument -w/--woord: expected one argument

$ python3 palindroomchecker.py

usage: palindroomchecker.py [-h] -w WOORD

palindroomchecker.py: error: the following arguments are required: -w/--woord

$ python3 palindroomchecker.py --help

usage: palindroomchecker.py [-h] -w WOORD

Bepaal of een woord een palindroom is.

optional arguments:

-h, --help

-w WOORD, --woord WOORD

Het woord waarvan je wilt controleren of het een

palindroom is

Argumenten die elkaar uitsluiten

We willen het programma nu uitbreiden zodat je de palindroomtest ook één voor één kunt uitvoeren op alle regels in een tekstbestand. Daarvoor voegen we het argument -b toe. Maar het heeft geen zin om zowel -w als -b tegelijk op te geven, dus we moeten kunnen aangeven dat beide argumenten elkaar uitsluiten. Ook dat kan eenvoudig met argparse:

parser = ArgumentParser(description='Bepaal of een woord een palindroom is.')

bron = parser.add_mutually_exclusive_group(required=True)

bron.add_argument("-w", "--woord", help="Het woord waarvan je wilt controleren of het een palindroom is")

bron.add_argument("-b", "--bestand", help="Het bestand met woorden waarvan je wilt controleren of ze een palindroom zijn")

args = parser.parse_args()

Met parser.add_mutually_exclusive_group maken we een groep argumenten aan die elkaar uitsluiten. Met required=True van die methode zegen we dat de gebruiker exact een van de argumenten uit de groep moet gebruiken. Daarna voegen we onze argumenten aan die groep toe in plaats van aan het object parser.

Als we nu de controle of een woord een palindroom is en het tonen van het resultaat afsplitsen in een afzonderlijke functie toon_resultaat (dat laten we als oefening over aan jou), kunnen we beide gevallen van invoer (een woord op de opdrachtregel of woorden in een bestand waarvan je de naam op de opdrachtregel doorgeeft) eenvoudig afhandelen:

if args.woord:

toon_resultaat(args.woord)

else:

with open(args.bestand, 'rt') as bestand:

for regel in bestand:

toon_resultaat(regel.strip())

Probeer dit maar eens uit. Je zult zien dat je programma een foutmelding geeft als je geen of juist allebei de argumenten opgeeft.

In kleur

Je kunt ook kleuren toevoegen aan de uitvoer van je programma. Daarvoor gebruiken we het pakket colorama, dat je eerst nog met pip3 (zie de vorige les) dient te installeren omdat het niet tot de standaardbibliotheek van Python behoort. We importeren enkele functies uit de module en initialiseren daarna colorama:

from colorama import init, Fore, Back, Style

init()

Daarna kun je spelen met de voorgrondkleur, achtergrondkleur en helderheid van de tekst:

print(Fore.RED + 'Rode tekst...')

print(Back.GREEN + '... met een groene achtergrond.')

print(Style.RESET_ALL + Fore.RED + Style.DIM + 'Dof...')

print(Fore.GREEN + Style.BRIGHT + '... of juist helder.')

print(Style.RESET_ALL)

print('En nu weer normaal!')

Op het einde van je programma voeg je het best altijd deze regel toe:

deinit()

Die reset de uitvoer, zodat de opdrachtregel na het uitvoeren van je programma niet plots helemaal in het rood is omdat je de voorgrondkleur bent vergeten terug te zetten!

Optionele argumenten

Die kleuren gaan we in onze palindroomchecker alleen gebruiken als je een optioneel argument --kleur aan je programma doorgeeft. Zo’n optioneel argument voegen we als volgt toe:

parser.add_argument("-k", "--kleur", action="store_true", help="Toon het gevraagde woord in kleur")

In ons programma kunnen we dan op de aanwezigheid van het optionele argument testen met if args.kleur:. Het if-else-blok uit ons originele programma vervangen we dan door de volgende geneste structuur:

if resultaat:

if args.kleur:

palindroom = Fore.GREEN + Style.BRIGHT + args.woord + Style.RESET_ALL

else:

palindroom = args.woord

print("Het woord '{}' is een palindroom.".format(palindroom))

else:

if args.kleur:

geen_palindroom = Fore.RED + Style.DIM + args.woord + Style.RESET_ALL

else:

geen_palindroom = args.woord

print("Het woord '{}' is geen palindroom.".format(geen_palindroom))

Fouten afhandelen

Als je nu in ons programma dat het argument -b voor een bestand ondersteunt een bestandsnaam doorgeeft die niet ondersteund is, breekt ons programma af met de volgende foutmelding en dan de bestandsnaam:

FileNotFoundError: [Errno 2] No such file or directory:

Bovendien krijg je ook de regel code te zien waarin het fout loopt. Voor een gebruiker die niets van Python kent, is dat nogal intimiderend. We gaan dus met een try-catch-blok die exception afhandelen (zie les 5) en een gebruiksvriendelijkere foutmelding tonen.

Voor we dat doen, moet je nog iets weten. Windows, Linux en macOS kennen drie ‘virtuele bestanden’ die belangrijk zijn op de opdrachtregel: stdin (de invoer van het toetsenbord), stdout (de normale uitvoer van het programma) en stderr (de foutenuitvoer van het programma). Standaard tonen we met print de uitvoer op stdout, maar met file=sys.stderr leiden we de foutenuitvoer om naar stderr. Dat ziet er dan als volgt uit (vergeet niet de regel import sys in het begin van je programma):

if args.woord:

toon_resultaat(args.woord)

else:

try:

with open(args.bestand, 'rt') as bestand:

for regel in bestand:

toon_resultaat(regel.strip())

except FileNotFoundError as fout:

print('Bestand {} niet gevonden'.format(fout.filename), file=sys.stderr)

We proberen hier dus het bestand te openen. Als dat niet lukt, vangen we een exception FileNotFoundError af. Merk op: met except FileNotFoundError as fout: kennen we de exception toe aan de variabele fout, zodat we nuttige informatie uit dit object kunnen opvragen. In dit geval is dat de bestandsnaam waarover het gaat (fout.filename). Die tonen we in de foutmelding aan de gebruiker, zodat die kan nakijken waarom het bestand niet bestaat.

De meldingen die we op stderr tonen, verschijnen overigens gewoon in de opdrachtregel zoals andere tekst die je met print toont. Maar het verschil is belangrijk. Zo kunnen andere programma’s bijvoorbeeld je foutmeldingen op stderr er uitfilteren.

Samenvatting

In deze les heb je geleerd hoe je een volledig Python-script ontwikkelt dat je op de opdrachtregel kunt uitvoeren. Je kunt argumenten afhandelen en foutmeldingen geven en je weet hoe je van kleur gebruik kunt maken in je programma. Daarmee sluiten we deze lessenreeks af. Je bent nu klaar om je eigen Python-programma’s te schrijven!

Opdracht

Voeg een optioneel argument ‘stil’ aan je programma toe dat alleen uitvoer geeft als het gevraagde woord een palindroom is, zodat je snel palindromen in grote bestanden kunt vinden.

Uitwerking

Het optionele argument voeg je eenvoudig als volgt toe: parser.add_argument("-s", "--stil", action="store_true", help="Toon het gevraagde woord als het een palindroom is; toon niets als het geen palindroom is.") Daarna definiëren we de functie toon_resultaat als volgt: def toon_resultaat(woord): resultaat = is_palindroom(woord) if resultaat: if args.stil: print(woord) else: print("Het woord '{}' is een palindroom.".format(woord)) else: if not args.stil: print("Het woord '{}' is geen palindroom.".format(woord)) In deze functie controleren we achtereenvolgens of het woord en palindroom is en of de gebruiker het optionele argument ‘stil’ heeft ingevoerd. Als we een palindroom hebben en het programma werkt stil, tonen we alleen het palindroom. Als we een palindroom hebben en het programma werkt niet stil, vertellen we in een hele zin dat het om een palindroom gaat. Als we geen palindroom hebben en het programma werkt stil, tonen we niets. En als we geen palindroom hebben en het programma werkt niet stil, vertellen we in een hele zin dat het niet om een palindroom gaat.

Cheatsheet

Stderr: de foutenuitvoer van een programma Stdout: de normale uitvoer van een programma

▼ Volgende artikel
Waar voor je geld: 5 mini-pc's als desktop- of laptopvervanger
© ID.nl
Huis

Waar voor je geld: 5 mini-pc's als desktop- of laptopvervanger

In de rubriek Waar voor je geld gaan we op zoek naar producten voor een mooie prijs die je leven makkelijk(er) maken. Werk je vaak thuis, maar is je werkplek niet al te groot? Dan kun je overwegen om een klein formaat pc aan te schaffen. Een mini-pc voldoet aan die behoefte, het enige dat nodig is, is een aparte monitor.

Een mini-pc kan een goede oplossing zijn voor thuiswerkplekken die niet al te groot zijn, of waar je simpelweg gewoon een opgeruimder bureau wil hebben. Mini-pc's zijn compact, maar snel en veelzijdig genoeg om er je gewone werk op te doen of om op te gamen. Wij vonden vijf krachtige mini-pc's voor je.

Acer Revo Box RB102-01W Mini

De Acer Revo Box RB102-01W Mini is een compacte computer die zijn rekenkracht ontleent aan een Intel Core Ultra 5 125U processor. Deze processor is ontworpen om een balans te bieden tussen prestaties en energie-efficiëntie. Voor het uitvoeren van je dagelijkse taken en het wisselen tussen verschillende applicaties beschikt het systeem over 8 GB aan DDR5 werkgeheugen. De opslag van je bestanden, software en het besturingssysteem wordt verzorgd door een 512 GB SSD, wat bijdraagt aan snelle opstart- en laadtijden. Qua connectiviteit kun je gebruikmaken van een reeks poorten. Zo zijn er meerdere USB-aansluitingen beschikbaar voor je randapparatuur. Voor het aansluiten van beeldschermen is de mini-pc uitgerust met zowel een HDMI- als een DisplayPort-uitgang. Om verbinding te maken met een netwerk, is er een 2.5 Gigabit Ethernetpoort aanwezig. Het systeem wordt geleverd met Windows 11 voorgeïnstalleerd.

Specificaties

Formaat: 13,1 x 13,1 x 4,3 cm
Processor:
Intel Core Ultra 5 125U
Werkgeheugen:
8 GB DDR5
Harde schijf:
512 GB SSD
Netwerk:
Wifi 6E, Bluetooth, 2.5 Gigabit LAN

MSI Cubi 5 12M-002EU

De MSI Cubi 5 12M-002EU is een rappe mini-pc van slechts 12,4 × 12,4 × 5,4 centimeter. Via de bijgesloten VESA-beugel monteer je de behuizing optioneel achterop een pc-monitor. Ondanks het nogal kleine formaat betreft het een volwaardige pc waarop je één of twee schermen kunt aansluiten. Gebruik hiervoor de HDMI- en/of DisplayPort-aansluiting aan de achterzijde. Verder zien we hier twee netwerk- en usb-poorten. Via drie usb-ingangen aan de voorzijde sluit je makkelijk randapparaten aan. Voor draadloze communicatie heeft de binnenzijde een bluetooth- en wifi-adapter.

In het kleine 'doosje' zit een ssd van 512 GB. Hierop is Windows 11 Pro voorgeïnstalleerd. Om die reden leent de Cubi 5 12M-002EU zich goed voor zakelijke gebruikers, want deze Windows-editie beschikt over extra veiligheidsfuncties. De Intel Core i5-1235U-processor voldoet voor dagelijkse pc-taken prima. Deze processor heeft tien rekenkernen waarvan de snelste twee zijn afgeregeld op een maximale klokfrequentie van 4,4 GHz. Tot slot is er een geheugenmodule van 8 GB RAM ingebouwd. Blijkt dat op den duur onvoldoende, dan kun je eventueel upgraden naar maximaal 64 GB RAM. Deze mini-pc is als alternatief ook met meer rekenpower verkrijgbaar.

Specificaties

Formaat: 12,4 x 12,4 x 5,4 cm
Processor:
Intel Core i5-1235U
Werkgeheugen:
8 GB DDR4
Harde schijf:
512 GB SSD
Netwerk:
Wifi 6E, Bluetooth 5.3, 1x Gigabit LAN, 1x 2.5 Gigabit LAN

Lenovo ThinkCentre M70q Gen 5 Mini PC 

De Lenovo ThinkCentre M70q Gen 5 is een compacte computer die zijn prestaties haalt uit een Intel Core i5-14400T processor. Voor het uitvoeren van je taken en het draaien van software is het systeem voorzien van 16 GB aan DDR5 werkgeheugen. Dit type geheugen heeft een hogere snelheid dan zijn voorganger, DDR4. Als het gaat om de opslag van je bestanden en programma's, dan maak je gebruik van een 512 GB SSD. De aanwezigheid van een SSD is van invloed op de opstarttijd van de computer en de laadsnelheid van je applicaties. Verbindingen met het internet en je lokale netwerk leg je via de ingebouwde Wi-Fi 6 (802.11ax) module of de aanwezige ethernetpoort. Voor het koppelen van randapparatuur zoals een monitor, muis of extern opslagapparaat, beschikt de mini-pc over een variatie aan poorten, waaronder HDMI, DisplayPort en meerdere USB-aansluitingen. Het besturingssysteem dat vooraf geïnstalleerd is, is Windows 11 Pro.

Specificaties

Formaat: 17,9 x 18,3 x 3,7 cm
Processor:
Intel Core i5-14400T
Werkgeheugen:
16 GB DDR5
Harde schijf:
512 GB SSD
Netwerk:
Wifi 6E, Bluetooth 5.3, Gigabit LAN

DELL OptiPlex 3000 Thin Client - N6005

De DELL OptiPlex 3000 in deze Thin Client-uitvoering is een systeem dat is ontworpen voor specifieke computertaken. Het apparaat draait op een Intel Pentium Silver N6005 processor, een chip die de basis vormt voor de functionaliteit. Voor het werkgeheugen is er 16 GB RAM aanwezig, wat van invloed is op de prestaties bij het gebruiken van meerdere programma's. De opslag bestaat uit een SSD met een capaciteit van 256 GB, waarop het besturingssysteem en je applicaties worden geïnstalleerd. Dit model is uitgerust met Dell ThinOS, een specifiek besturingssysteem dat is gericht op het werken met virtuele desktopomgevingen. Voor het aansluiten van je apparatuur beschikt de computer over diverse poorten. Je vindt er onder andere USB 3.2-poorten, een netwerkaansluiting en twee DisplayPort-uitgangen voor het koppelen van beeldschermen. De compacte behuizing maakt het mogelijk om het systeem op verschillende manieren te plaatsen

Specificaties

Formaat: 18,2 x 17,8 x 3,6 cm
Processor:
Intel Pentium Silver N6005
Werkgeheugen:
16 GB DDR4
Harde schijf:
256 GB SSD
Netwerk:
Gigabit LAN

Blackview MP100 Mini PC

Binnen de compacte behuizing van de Blackview MP100 vind je een AMD Ryzen 7 5825U processor, een chip met 8 kernen die de taken van het systeem verwerkt met een maximale turbofrequentie van 4.5 GHz. Voor het gelijktijdig gebruiken van verschillende programma's is het systeem, afhankelijk van de uitvoering, voorzien van 16 GB of 32 GB DDR4 werkgeheugen. Mocht je in de toekomst meer geheugen nodig hebben, dan is dit uit te breiden tot een maximum van 64 GB. De opslag van je bestanden en software wordt verzorgd door een M.2 SSD, met een capaciteit van 512 GB of 1 TB. Qua verbindingen heb je de beschikking over Wi-Fi 6 en Bluetooth 5.2 voor draadloze connectiviteit. Fysieke aansluitingen zijn er ook volop: het apparaat heeft onder andere USB 3.2-poorten, twee Type-C poorten, een HDMI-aansluiting en een DisplayPort. Hiermee kun je tot drie 4K-beeldschermen tegelijk aansturen. Het vooraf geïnstalleerde besturingssysteem op dit model is Windows 11 Pro.

Specificaties

Formaat: 12,8 x 12,8 x 5,2 cm
Processor: AMD Ryzen 7 5825U
Werkgeheugen:
16 GB of 32 GB DDR4
Harde schijf:
512 GB of 1 TB SSD
Netwerk:
Wifi 6, Bluetooth 5.2, Gigabit LAN

▼ Volgende artikel
Acer lanceert Swift Air 16: ultralichte Copilot+-laptop met AMD Ryzen AI-chip
© Acer
Huis

Acer lanceert Swift Air 16: ultralichte Copilot+-laptop met AMD Ryzen AI-chip

Acer heeft de nieuwe Swift Air 16 (SFA16-61M) gepresenteerd, een ultralichte 16 inch-laptop die minder dan een kilo weegt. De laptop is bedoeld voor gebruikers die veel reizen en combineert een ruim scherm met de nieuwste AI-functies van Windows 11.

De Swift Air 16 draait op de AMD Ryzen AI 300-serie processoren, tot maximaal een Ryzen AI 7 350. Deze chips zijn ontworpen om lokale AI-toepassingen sneller en energiezuiniger uit te voeren. Volgens Acer gaat de batterij tot 13 uur mee. De laptop is bovendien onderdeel van Microsofts Copilot+ pc-programma, waarmee functies als Recall, Click to Do en verbeterde Windows Search beschikbaar zijn voor productiever werken.

De behuizing is gemaakt van een magnesium-aluminiumlegering, wat zorgt voor stevigheid bij een gewicht van minder dan één kilo. Daarmee behoort de Swift Air 16 tot de lichtste laptops met een 16 inch-scherm. Gebruikers kunnen kiezen uit verschillende kleuruitvoeringen en twee schermopties: een WQXGA+ AMOLED-display met 120 Hz verversingssnelheid of een WUXGA IPS-paneel met een refresh rate van 60 Hz. De AMOLED-versie biedt een hoge helderheid (400 nits) en volledige DCI-P3-kleurruimte, wat vooral interessant is voor ontwerpers en andere creatieve professionals.

Voor videogesprekken is de laptop uitgerust met een 2MP Full HD IR-camera met privacysluiter en gezichtsherkenning via Windows Hello. Twee microfoons en luidsprekers zorgen voor helder geluid. Qua aansluitingen zijn er twee USB-C-poorten, een USB-A-poort en een HDMI 1.4-uitgang. Draadloos biedt het apparaat ondersteuning voor wifi 6E en de nieuwste Bluetooth-standaard.


De Acer Swift Air 16 ligt vanaf november 2025 in de Benelux in de winkels, met een adviesprijs vanaf 999 euro.


Wat is een Copilot+ pc?

Een Copilot+ pc is een nieuwe generatie Windows-laptops uitgerust met speciale AI-chips. Deze zorgen ervoor dat functies als spraakcommando's, samenvatten van documenten of beeldherkenning lokaal worden uitgevoerd in plaats van in de cloud. Dat maakt ze sneller en energiezuiniger.