Questa è meno una domanda sulla natura della tipizzazione delle anatre e più sul rimanere pitoni, suppongo.
Prima di tutto - quando si tratta di dicts, in particolare quando la struttura del dict è abbastanza prevedibile e una determinata chiave non è in genere presente ma a volte lo è, penso innanzitutto a due approcci:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
E ovviamente l'approccio del "perdono contro permesso" di Ye Olde.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Come un giornalista di Python, mi sembra di vedere quest'ultimo preferito molto, il che mi sembra strano solo perché in Python i documenti try/excepts
sembrano essere preferiti quando c'è un vero errore, al contrario di, um ... assenza di successo?
Se il dict occasionale non ha la chiave in myDict ed è noto che non avrà sempre quella chiave, è un tentativo / se non contestualmente fuorviante? Questo non è un errore di programmazione, è solo un dato di fatto: questo dict non aveva quella chiave particolare.
Questo sembra particolarmente importante quando guardi la sintassi try / tranne / else, che sembra davvero utile quando si tratta di assicurarsi che try non stia rilevando troppi errori. Sei in grado di fare qualcosa del tipo:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Questo non porterà a inghiottire tutti i tipi di strani errori che sono probabilmente il risultato di un codice errato? Il codice sopra potrebbe impedirti di vedere che stai provando ad aggiungere 2 + {}
e potresti non accorgerti mai che parte del tuo codice è andata terribilmente storto. Non suggerisco che dovremmo controllare tutti i tipi, ecco perché è Python e non JavaScript - ma di nuovo con il contesto di try / tranne, sembra che dovrebbe catturare il programma facendo qualcosa che non dovrebbe fare, invece di consentirgli di proseguire.
Mi rendo conto che l'esempio sopra è una sorta di argomento da uomo di paglia, ed è di fatto intenzionalmente negativo. Ma dato il credo pitonico di better to ask forgiveness than permission
non posso fare a meno di pensare che si pone la questione di dove si trovi effettivamente la linea nella sabbia tra la corretta applicazione di if / else vs try / tranne, in particolare quando sai cosa aspettarti da i dati con cui stai lavorando.
Non sto nemmeno parlando di problemi di velocità o buone pratiche qui, sono solo un po 'confuso dal diagramma percepito di Venn in cui sembra che potrebbe andare in entrambi i modi, ma le persone sbagliano sul lato di un tentativo / tranne perché "qualcuno da qualche parte ha detto che era Pythonic". Ho tratto conclusioni errate sull'applicazione di questa sintassi?