Maak een getypeerd materiaalrecord
Laat parse_row een dictionary met name als NFC-string en units als niet-negatieve integer teruggeven. Voorloopnullen in het aantal mogen.
Een lijst materiaal komt binnen als tekstregels met een naam en een aantal. Sommige regels zijn onbruikbaar, maar de goede gegevens wil je wel bewaren. Je bouwt daarom een kleine parser die beide uitkomsten zichtbaar houdt.
Een parser zet tekst met een afgesproken vorm om in gegevens waarmee je programma verder kan werken. Hier is de vorm eenvoudig: een naam, één puntkomma en een niet-negatief geheel aantal. Het gaat om dit kleine formaat; aanhalingstekens en puntkomma's binnen namen ondersteunen we niet.
parse_row maakt eerst onderdelen met split(";"). Er moeten precies twee velden zijn. Met strip verwijder je witruimte aan de buitenkant van elk veld, zodat een spatie rond de puntkomma geen extra betekenis krijgt.
Een ontbrekende naam maakt de regel ongeldig. Normaliseer een geldige naam daarna naar NFC, met behoud van hoofdletters en eventuele spaties binnen de naam. Daarmee gebruik je de afspraak uit de eerdere Unicode-les opnieuw.
Het aantal mag alleen uit één of meer ASCII-cijfers bestaan. Gebruik bijvoorbeeld re.fullmatch(r"[0-9]+", amount): de plus betekent één of meer keer het vorige onderdeel. Een minteken, lege waarde of andere cijferreeks past dus niet.
Na die controle zet int het aantal om in een getal. Voorloopnullen mogen: de tekst 007 wordt het getal zeven. Geef de dictionary met de sleutels name en units terug, of None als de regel niet aan de afspraken voldoet.
parse_batch verwerkt meerdere regels en gebruikt daarvoor parse_row. Met splitlines verdeel je de tekst ook wanneer regels met een Windows-regeleinde eindigen. Sla volledig lege regels en regels met alleen witruimte over.
Voeg geldige dictionaries in hun oorspronkelijke volgorde aan een lijst toe. Bewaar ongeldige regels in een tweede lijst, precies zoals ze binnenkwamen. Geef beide lijsten samen als tuple terug, zodat de aanroeper kan besluiten wat er met de afwijzingen gebeurt.
Dit zelfstandige voorbeeld gebruikt instellingen met een gelijkteken. Voorspel de twee verzamelingen: de bruikbare waarden en de regel waarvoor geen waarde kon worden gelezen.
settings = " kleur = groen\n\ngeen-keuze\nvorm = rond"
values = {}
rejected = []
for line in settings.splitlines():
if not line.strip():
continue
parts = line.split("=", 1)
if len(parts) != 2 or not parts[0].strip():
rejected.append(line)
else:
values[parts[0].strip()] = parts[1].strip()
print(values)
print(rejected){'kleur': 'groen', 'vorm': 'rond'}
['geen-keuze']
Het voorbeeld en de opdrachten gebruiken hetzelfde idee van twee uitkomsten, maar verschillende tekstformaten. Voor de materiaalregels moet je ook het aantal controleren, een integer maken en de naam normaliseren. Werk die verantwoordelijkheid eerst in de kleine functie uit voordat je meerdere regels doorloopt.
Alleen goede regels verzamelen lijkt handig. De aanroeper kan dan echter niet zien dat een deel van de invoer is overgeslagen. Voer de foutvariant uit en controleer welke aangeleverde regel nergens meer terugkomt.
records = []
for line in ["Noord:8", "kapot"]:
parts = line.split(":")
if len(parts) == 2:
records.append(parts)
print(records)[['Noord', '8']]
De kapotte regel is verdwenen. Een lijst met afgewezen regels voorkomt dat dit verlies onzichtbaar blijft. Bewaar daarin ook de oorspronkelijke spaties; die kunnen later helpen om te begrijpen wat er fout ging.
Maak voor iedere geldige regel een eigen dictionary. Twee gelijke namen mogen twee aparte records opleveren; gebruik de naam dus niet als unieke sleutel voor de hele lijst. Een wijziging aan één resultaatrecord mag een ander record niet mee veranderen.
Laat parse_row een dictionary met name als NFC-string en units als niet-negatieve integer teruggeven. Voorloopnullen in het aantal mogen.
Laat parse_row buitenste witruimte verwijderen en bij een ontbrekende naam, verkeerde veldtelling of ongeldig aantal None teruggeven. Alleen ASCII-cijfers tellen.
Laat parse_batch een tuple met records en afgewezen regels teruggeven. Behoud de volgorde, sla lege regels over en bewaar ongeldige regels ongewijzigd.
Laat parse_batch ook gelijke namen als aparte records bewaren. Ieder record en iedere nieuwe aanroep moeten onafhankelijke resultaatlijsten opleveren.
Hierna leer je fouten opvangen en begrijpelijk doorgeven wanneer een functie echt moet stoppen.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.