Obiettivo: restituire un valore da una funzione nelle unità (o qualsiasi piccola modifica) richiesta dal chiamante.Modo Pythonic per avere un valore di ritorno di una funzione in unità corrette
Priorità:
Sono in esecuzione Python 2.7 da un lampone Pi 3, e utilizzare la funzione distance()
per ottenere la distanza un encoder rotativo ha trasformato. Ho bisogno di questa distanza in unità diverse a seconda di dove viene chiamata la funzione. Come allora, dovrebbe essere scritto pitonicamente (cioè breve, e facilmente mantenuto).
First Attempt:.
Il mio primo tentativo è stato quello di utilizzare un'unità di metri nella funzione, e hanno una lunga elif
albero per selezionare le unità giuste per tornare in
def distance(units='m'):
my_distance = read_encoder()
if units == 'm':
return my_distance * 1.000
elif units == 'km':
return my_distance/1000.
elif units == 'cm':
return my_distance * 10.00
elif units == 'yd':
return my_distance * 1.094
else:
return -1
La cosa bella di questo approccio è che ha un modo per riconoscere un'unità che non è disponibile.
secondo tentativo:
Il mio secondo tentativo è stato quello di creare un dizionario per contenere vari multipliers
.
def distance(units='m'):
multiplier = {
'm': 1.000,
'km': 0.001,
'cm': 10.00
'yd': 1.094
}
try:
return read_encoder() * mulitplier[units]
except KeyError:
return -1
Qui, le unità non riconosciute sono catturati con un KeyError
.
Rilevanza:
So di librerie esistenti come Pint, ma sono alla ricerca di una soluzione a questo problema di programmazione. Quando hai una funzione in Python, e devi apportare lievi modifiche all'output in modo riutilizzabile. Ho altre funzioni come speed()
che usano 'm/s' come unità di base e ho bisogno di un argomento simile units
. Dalla mia esperienza, un programma ben strutturato non coinvolge un paragrafo di rami elif
prima di ogni dichiarazione di ritorno. In questo caso, se volessi cambiare il modo in cui calcolerò le unità, dovrei fare attenzione a grep
attraverso il mio codice e assicurarmi di cambiare il modo in cui le unità vengono calcolate ad ogni istanza. Una soluzione adeguata richiederebbe solo una modifica del calcolo una volta.
Questo è probabilmente troppo ampio, ma è un modello su cui continuo a correre.
Personalmente vorrei andare con il secondo tentativo, anche se avevo intenzione di usare un sacco di C# dev dentro di me direbbe rendere un metodo di estensione ' .convertTo ('ms') 'per esempio. Quindi potresti eseguire 'encoderReading.convertTo ('m')' e penso che la sintassi sia davvero bella. –
Quindi sai che tutti i tuoi valori sono potenze di 10 e sai anche che gli interi sono più veloci delle stringhe, quindi puoi ottimizzarlo ulteriormente mappando i valori statici del moltiplicatore in quelli impostati dinamicamente usando map e lambda. – dmitryro
Sfortunatamente, la mia implementazione effettiva ha anche unità non SI (cioè yard, miglia). Tutti vogliono i dati visualizzati nella loro unità di scelta. Aggiornerò la mia domanda per riflettere questo. –