Ziel: geben Sie einen Wert von einer Funktion in den Einheiten (oder jeder trivialen Änderung) zurück, die vom Aufrufer angefordert wurden.Pythonischer Weg, um einen Funktionsrückgabewert in geeigneten Einheiten zu haben
Hintergrund:
Ich bin mit Python 2.7 auf einem Raspberry Pi 3, und verwenden Sie die Funktion distance()
den Abstand ein Drehgeber gedreht hat zu bekommen. Ich brauche diese Distanz in verschiedenen Einheiten, abhängig davon, wo die Funktion aufgerufen wird. Wie dann, sollte dies pythonisch geschrieben werden (d. H. Kurz, und leicht zu pflegen).
erster Versuch.
Mein erster Versuch, eine Einheit von Metern in der Funktion und einen langen elif
Baum hat zu verwenden war, die richtigen Einheiten auszuwählen, die in zurückzukehren
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
Das Schöne an diesem Ansatz ist, dass es eine Möglichkeit gibt, eine Einheit zu erkennen, die nicht verfügbar ist.
Zweiter Versuch:
Mein zweiter Versuch war ein Wörterbuch erstellen verschiedene multipliers
enthalten.
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
Hier werden nicht erkannte Einheiten mit einem KeyError
gefangen.
Relevanz:
ich von vorhandenen Bibliotheken weiß wie Pint, aber für eine Lösung dieses Programmierproblem suchen. Wenn Sie in Python über eine Funktion verfügen, müssen Sie die Ausgabe leicht wiederverwenden. Ich habe andere Funktionen wie speed()
, die 'm/s' als Basiseinheit verwenden, und benötigen ein ähnliches units
Argument. Aus meiner Erfahrung enthält ein gut strukturiertes Programm keinen Absatz von elif
Verzweigungen vor jeder Rückkehranweisung. Wenn ich in diesem Fall ändern wollte, wie ich die Einheiten berechne, müsste ich vorsichtig über meinen Code grep
gehen und sicherstellen, dass ich die Berechnung der Einheiten in jedem Fall ändere. Eine richtige Lösung würde nur eine einmalige Änderung der Berechnung erfordern.
Dies ist möglicherweise zu breit, aber es ist ein Muster, in das ich laufend renne.
Persönlich würde ich mit dem zweiten Versuch gehen, aber wenn ich es viel der C# Entwickler in ich sagen würden, zu verwenden beabsichtigt, eine Erweiterungsmethode machen ' .convertTo ('ms') 'zum Beispiel. Dann könnten Sie 'encoderReading.convertTo ('m')' tun und ich denke, dass Syntax wirklich nett aussieht. –
Sie wissen also, dass alle Ihre Werte Potenzen von 10 sind und Sie wissen auch, dass Ganzzahlen schneller als Strings sind. Sie können sie also weiter optimieren, indem Sie statische Werte des Multiplikators mithilfe von map und lambda in dynamisch festgelegte Werte mappen. – dmitryro
Leider hat meine tatsächliche Implementierung auch Nicht-SI-Einheiten (d. H. Yards, Meilen). Jeder möchte, dass Daten in seiner Auswahleinheit angezeigt werden. Ich werde meine Frage aktualisieren, um das zu reflektieren. –