Sorprendentemente, Python ti offre molta scelta qui. La maggior parte del codice Python è piuttosto informale riguardo ai tipi esatti e se alcuni attributi fanno parte dell'interfaccia pubblica. Funziona bene, finché non lo fa. In particolare, il mantenimento di progetti di grandi dimensioni è più impegnativo in linguaggi dinamici come Python.
Ma come dice lo Zen di Python: Explicit è meglio di implicito.
Python si sta muovendo verso abilitando ma non richiede uno stile più rigoroso. È importante sottolineare che le versioni recenti di Python aggiungono la sintassi per le annotazioni sul tipo. Sebbene queste annotazioni siano relativamente limitate e non abbiano alcun effetto di runtime (di solito vengono elaborate da controllori di tipi esterni come mypy) rendono più fattibile l'uso della digitazione statica in parti del codice. Se questo è fattibile dipende da quali moduli stanno usando, dal momento che la maggior parte dei moduli non fornisce alcuna annotazione sul proprio, e alcuni non hanno nemmeno interfacce che possono essere digitate.
Questo è un po 'simile a JavaScript e TypeScript: il controllo del tipo (con tutti i suoi vantaggi come un migliore autocompletamento semantico negli editor) è disponibile se lo si desidera, ma non si è obbligati a dichiarare i tipi.
Quindi, se ti senti così ti aiuta a mantenere il tuo codice gestibile ...
- fai uso di docstring
- usa le annotazioni sui tipi
- usa pedine esterne e linters come mypy e pylint
- preferisci le proprietà di sola lettura rispetto all'assegnazione diretta di attributi pubblici
- crea interfacce esplicite (ad esempio utilizzando la classe di base
abc.ABC
)
-
esplicitamente assert
delle precondizioni di funzione, ad esempio:
assert isinstance(param, SomeInterface), \
f"param must be SomeInterface, but was {type(param)}"'
Il codice Python che scrivo tende a farlo, con moderazione. Soprattutto perché il controllo di tipo statico è un componente aggiuntivo successivo, è piuttosto limitato e non sempre funziona. E non vale davvero la pena di incapsulare meticolosamente ogni attributo come faresti in Java. Ma i controlli più potenti aiutano a catturare i bug in anticipo, quindi essere un po 'più espliciti del solito può essere una buona idea.