Objectif: retourner une valeur d'une fonction dans les unités (ou toute modification triviale) demandée par l'appelant.Façon pythonienne d'avoir une valeur de retour de fonction dans les unités appropriées
Contexte:
Je courais Python 2.7 sur un Raspberry Pi 3, et utiliser la fonction distance()
pour obtenir la distance un codeur rotatif a tourné. J'ai besoin de cette distance dans différentes unités en fonction de l'endroit où la fonction est appelée. Comment alors, devrait-il être écrit pythoniquement (c'est-à-dire court et facile à maintenir).
première tentative.
Ma première tentative a été d'utiliser une unité de mètres dans la fonction, et ont un long arbre elif
pour sélectionner les unités droite pour retourner dans
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 bonne chose à propos de cette approche est qu'elle a un moyen de reconnaître une unité qui n'est pas disponible.
Deuxième tentative:
Ma deuxième tentative a été de créer un dictionnaire pour contenir divers 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
Ici, les unités non reconnues sont pris avec un KeyError
.
Pertinence:
Je sais que des bibliothèques existantes comme Pint, mais je cherche une solution à ce problème de programmation. Lorsque vous avez une fonction en Python, et que vous avez besoin d'apporter de légères modifications à la sortie de manière réutilisable. J'ai d'autres fonctions telles que speed()
qui utilisent 'm/s' comme unité de base, et ont besoin d'un argument units
similaire. D'après mon expérience, un programme bien structuré n'implique pas un paragraphe de elif
branches avant chaque déclaration de retour. Dans ce cas, si je voulais changer la manière dont je calcule les unités, je devrais faire attention à grep
à travers mon code, et m'assurer de changer la façon dont les unités sont calculées à chaque instance. Une solution adéquate ne nécessiterait qu'une modification du calcul une fois.
Ceci est peut-être trop large, mais c'est un modèle que je continue à courir.
Personnellement, j'aller avec la deuxième tentative, mais si je voulais l'utiliser beaucoup C# dev intérieur de moi dirait faire une méthode d'extension ' .convertTo ('ms') 'par exemple. Ensuite, vous pouvez faire 'encoderReading.convertTo ('m')' et je pense que la syntaxe est vraiment belle. –
Donc, vous savez que toutes vos valeurs sont des puissances de 10 et vous savez aussi que les entiers sont plus rapides que les chaînes, donc vous pouvez l'optimiser en mappant les valeurs statiques du multiplicateur en celles définies dynamiquement en utilisant map et lambda. – dmitryro
Malheureusement, ma mise en œuvre réelle a des unités non SI (c'est-à-dire des yards, des miles) également. Tout le monde veut que les données soient affichées dans leur unité de choix. Je vais mettre à jour ma question pour refléter cela. –