come seguire gli standard del polimorfismo python con le funzioni matematiche

4

Quindi sto leggendo su python nel meraviglioso libro LEARNING PYTHON di Mark Lutz. Mark fa un grosso problema sul modo in cui parte della filosofia di sviluppo di Python è il polimorfismo e che le funzioni e il codice dovrebbero fare affidamento sul polimorfismo e non fare molti controlli di tipo. Comunque, faccio un sacco di programmi di matematica e quindi l'idea del polimorfismo non sembra proprio applicarsi - non voglio provare ad eseguire una regressione su una stringa o qualcosa del genere. Quindi mi stavo chiedendo se c'è qualcosa che mi manca qui. Quali sono le applicazioni del polimorfismo quando scrivo funzioni per la matematica - o in questo caso il controllo del tipo è filosoficamente corretto.

    
posta krishnab 28.06.2013 - 03:48
fonte

2 risposte

1

Sei certamente autorizzato a fare il controllo dell'input. In alcune lingue, puoi controllare gli argomenti di input per assicurarti che siano del tipo appropriato (cioè, sono della classe giusta). Tuttavia, in Python, è spesso preferibile verificare se l'input espone le capacità necessarie. Questo a volte viene chiamato Duck Typing , dopo il motto che se qualcosa cammina come un'anatra e cova come un'anatra, probabilmente è un anatra - o almeno qualcosa che una funzione di elaborazione anatra dovrebbe essere in grado di gestire.

Per darti un esempio più concreto, supponi di scrivere una funzione che calcola la media di un elenco di numeri. Invece di controllare se il parametro sia, di fatto, un elenco, controlla se è iterabile (o anche meglio, prova ad iterarlo e lanciare un'eccezione se non lo è). Ciò consente alla funzione di lavorare per elenchi, tuple, set, file, valori da database e persino oggetti non ancora salvati che memorizzano raccolte di numeri. D'altra parte, sei certamente autorizzato, e persino incoraggiato, a fare controlli specifici per il dominio. Se il tuo codice riceve valori matematicamente privi di senso (ad es. Probabilità negative), probabilmente dovrebbe generare un'eccezione o in qualche modo segnalare un errore.

Nel complesso, la filosofia di Python sembra essere "controlla quanto è necessario, ma non di più. Se il chiamante fa qualcosa di strano, è almeno in parte il loro problema (come regredire su una stringa). linee guida, non regole rigide e veloci, quindi usa il buon senso.

    
risposta data 29.06.2013 - 08:24
fonte
0

Il punto del polimorfismo è che se si scrive una funzione di regressione per, per esempio, i tipi numerici incorporati di Python, qualcun altro può usarlo con NumPy o qualche altra libreria numerica e non pensarci. Non devi nemmeno sapere dell'esistenza di tali librerie per essere sicuro di scrivere correttamente il tuo codice. Basta usare le strutture del linguaggio naturale e lasciarlo a chiunque crei la prossima grande libreria numerica per assicurarti che i loro tipi numerici possano essere usati normalmente, le loro liste e sequenze possono essere iterate da for loops, ecc.

Spezzare il polimorfismo per difendersi da codifiche scadenti o per far rispettare un certo uso del tuo grimorio non ti fa guadagnare nulla. Ma potrebbe limitare i futuri utenti del tuo codice senza una buona ragione.

I was wondering if there is something I am missing here

Non mancano nulla, ma forse complicazioni eccessive. Scrivi una funzione che prende gli argomenti che desideri e la documenta di conseguenza. Questo è tutto.

I don't want to try and run a regression on a string or something

Né tu né nessun altro dovresti passare una stringa in una funzione di regressione. Chi lo farebbe? Il codice non dovrebbe fare nulla per caso - se lo è, stai solo programmando per ipotesi, che è destinato a fallire in qualsiasi lingua.

is type checking philosophically okay in this case.

La risposta a questo è quasi sempre no.

La filosofia generale di Python è che tu pensi che le altre persone che usano il tuo codice saranno sensate su di esso - perché se non lo sono, c'è davvero niente che ti aiuterà. Nessun tipo di sistema, nessun controllo, nessuna funzionalità linguistica incorporata può difendersi da qualcuno schiacciando il loro volto sulla tastiera e chiamando la funzione con il risultato.

Il motivo principale è questo: Python è progettato per scrivere codice conciso, espressivo, leggibile con un minimo di testo standard. Se aggiungi te stesso manualmente tutta la caldaia, stai sconfiggendo il punto. Quindi rilassati e usa la lingua per esprimere le tue idee nel modo più preciso possibile:)

    
risposta data 29.06.2013 - 07:16
fonte

Leggi altre domande sui tag