02 Csv Report — DedSec Project
Αναφορά CSV: ακριβή δεκαδικά και προβληματική είσοδος Το συνοδευτικό report.py ομαδοποιεί γραμμές CSV με στήλες category και amount χρησιμοποιώντας decimal.Decimal. Η Decimal χρειάζεται…
Αναφορά CSV: ακριβή δεκαδικά και προβληματική είσοδος
Το συνοδευτικό report.py ομαδοποιεί γραμμές CSV με στήλες category και amount χρησιμοποιώντας decimal.Decimal. Η Decimal χρειάζεται όταν το 0.10 μαζί με το 0.20 πρέπει να δώσει ακριβώς 0.30. Η συνάρτηση report δέχεται pathlib.Path και επιστρέφει σύνολα ανά κατηγορία. Η δοκιμή δημιουργεί μόνο προσωρινά αρχεία και δεν αγγίζει πραγματικά έξοδα ή αρχεία του έργου.
Εκτελέσιμη δοκιμή συνοδευτικού script
Αποθήκευσε ως lab.py δίπλα στο συνοδευτικό script και εκτέλεσε python3 lab.py.
from decimal import Decimal, InvalidOperation
from pathlib import Path
from tempfile import TemporaryDirectory
from report import report
with TemporaryDirectory() as d:
path = Path(d) / "good.csv"
path.write_text("category,amount\nfood,0.10\nfood,0.20\nrent,1.00\n", encoding="utf-8")
totals = report(path)
assert totals["food"] == Decimal("0.30")
assert totals["rent"] == Decimal("1.00")
for contents, error in [
("amount\n1\n", ValueError),
("category,amount\n,1\n", ValueError),
("category,amount\nfood,abc\n", InvalidOperation),
]:
path.write_text(contents, encoding="utf-8")
try:
report(path)
raise AssertionError("expected rejected CSV")
except error:
pass
print("PASS: decimal CSV report")
Διάγνωση και περιορισμοί
Απαιτούνται και οι δύο κεφαλίδες. Κενή κατηγορία προκαλεί ValueError, ενώ ποσό abc προκαλεί decimal.InvalidOperation. Κάθε αρνητική δοκιμή ελέγχεται ξεχωριστά. Το υπάρχον πρόγραμμα επιτρέπει αρνητικά ποσά και μη πεπερασμένες τιμές όπως NaN: αποφάσισε αν τα αρνητικά είναι επιστροφές χρημάτων, αλλά απόρριψε μη πεπερασμένα ποσά πριν εμφανίσεις σύνολα. Αφαιρεί κενά από τις κατηγορίες χωρίς να εξισώνει πεζά και κεφαλαία, άρα Food και food διαφέρουν. Η DictReader χρειάζεται σαφή κανόνα για επιπλέον στήλες και ελαττωματικά εισαγωγικά. Η στρογγυλοποίηση της εμφάνισης δεν αντικαθιστά τον έλεγχο εισόδου.
Ασκήσεις επέκτασης
- Απόρριψε μη πεπερασμένα ποσά με is_finite(). 2. Όρισε αν το -2.00 είναι επιστροφή και έλεγξε τον κανόνα. 3. Δοκίμασε κατηγορία με κόμμα μέσα σε εισαγωγικά. 4. Αποφάσισε αν οι κατηγορίες διακρίνουν πεζά και κεφαλαία. Τεκμήριο: PASS, ακριβές 0.30 και τρεις απορριπτέες είσοδοι.