Για τα tests, προσωπικά, χρησιμοποιώ την βιβλιοθήκη py.test. Πατσάρει την assert και δεν χρειάζεσαι όλες τις συναρτήσεις που χρησιμοποιεί η unittest (πχ assertEqual, assertListEqual κτλ). Χρησιμοποιείς παντού σκέτο assert.
Όπως και αν έχει, εφόσον απορρίπτεις σιωπηλά τα παραπάνω δεκαδικά ψηφία, νομίζω ότι κάτι σαν και το ακόλουθο θα ήταν επαρκές (θεωρώ ότι δεν κάνεις στρογγυλοποίηση!)
self.assertEqual(n2g("27.01", n2g("27.013"))
self.assertEqual(n2g("27.01", n2g("27.019"))
Από εκεί και πέρα, ίσως να είχε νόημα να έχεις δύο modes. Ένα lenient στο οποίο θα έχεις την συμπεριφορά που έχεις τώρα, και ένα strict όπου τα παραπάνω δεκαδικά ψηφία θα πετάνε exception ή έστω ένα warning (
pymotw.com/2/warnings/).
Τα παραπάνω φυσικά εξαρτώνται από το τι features χρειάζεσαι.
Α! και όσον αφορά το representation, νομίζω θα είχε νόημα και ένα 3ο mode εκτός των ("upper", "lower"). Πιο συγκεκριμένα κάτι σαν το "sentence"
>>> n2g(848922.01, True, 'sentence')# Πεζοί χαρακτήρες.
'Οκτακόσιες σαράντα οκτώ χιλιάδες εννιακόσια είκοσι δύο ευρώ και ένα λεπτά'
Όχι ότι είναι δύσκολο να το κάνεις μόνος σου μετά, αλλά δεν είναι και τίποτα να το υλοποιεί η βιβλιοθήκη απευθείας.
Όσον αφορά την απόδοση, αυτή τη στιγμή δημιουργείς τα ίδια dictionaries κάθε φορά που καλείς την «n2g()». Θα μπορούσες να την βελτιώσεις λίγο μετατρέποντας τα dictionaries σε constants και περνώντας τα σαν arguments στις διάφορες συναρτήσεις.
DEKADES = {
10: "Δέκα",
11: "Έντεκα",
12: "Δώδεκα",
13: "Δεκατρία",
...
}
def _metatropi_dekadon(..., dekades=DEKADES):
...
Και μια παρατηρήση όσον αφορά το API. Προσωπικά νοίωθω λίγο περίεργα με τα greeklish στον προγραμματισμό. Πχ η παράμετρος «nomisma», δύσκολα θα είναι κατανοητή από κάποιον που δεν γνωρίζει ελληνικά. Ναι, η συντριπτική πλειοψηφία αυτών που θα χρησιμοποιήσουν την εφαρμογή είναι έλληνες, αλλά γιατί να αποκλείσεις κάποιον;
Τέλος, ίσως η παράμετρος «nomisma» να έχει νόημα να μετατρεπεί από boolean σε string και να έχει default τιμή το «eur». Πχ:
CURRENCIES = {
"eur": "ευρώ",
"usd": "δολάρια",
"aud": "δολάρια Αυστραλίας"
"zar": "ράντ",
...
}
>>> n2g(848922.01, "usd", 'sentence')# Πεζοί χαρακτήρες.
'Οκτακόσιες σαράντα οκτώ χιλιάδες εννιακόσια είκοσι δύο δολάρια και ένα λεπτά'