Цель: вернуть значение из функции в единицах (или любых тривиальных модификациях), запрошенных вызывающим абонентом.Pythonic способ получить возвращаемое значение функции в соответствующих единицах
фон:
Я бег на Python 2.7 на Raspberry Pi 3, а также использовать функцию distance()
, чтобы получить расстояние ротационного энкодер превратил. Мне нужно это расстояние в разных единицах в зависимости от того, где вызывается функция. Как же тогда это должно быть написано пифонически (т. Е. Коротко и легко поддерживается).
Первая попытка:.
Моя первая попытка была использовать единицу метров в функции, и имеют длинный elif
дерево, чтобы выбрать правильные единицы, чтобы вернуться в
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
Приятная вещь в этом подходе заключается в том, что у него есть способ распознать устройство, которое недоступно.
Вторая попытка:
Моя вторая попытка была создать словарь, чтобы содержать различные 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
Здесь непризнанные единицы пойманы с KeyError
.
релевантности:
Я знаю существующих библиотек, как Pint, но я ищу решение этой проблемы программирования. Когда у вас есть функция в Python, и вам нужно внести небольшие изменения в результат многоразовым способом. У меня есть другие функции, такие как speed()
, которые используют «м/с» в качестве базового блока и нуждаются в аналогичном аргументе units
. По моему опыту, хорошо структурированная программа не включает параграф elif
ветвей перед каждым оператором возврата. В этом случае, если бы я хотел изменить способ вычисления единиц, мне пришлось бы тщательно выполнить grep
через мой код и убедиться, что я изменяю способ вычисления единиц в каждом экземпляре. Правильное решение потребовало бы только однократного изменения расчета.
Возможно, это слишком широкий, но это шаблон, в котором я постоянно сталкиваюсь.
Лично я бы пойти со второй попытки, хотя, если я намеревался использовать его много С # DEV внутри меня сказал бы сделать метод расширения ' .convertTo ('ms') 'например. Тогда вы можете сделать 'encoderReading.convertTo ('m')', и я думаю, что синтаксис выглядит очень хорошо. –
Итак, вы знаете, что все ваши значения имеют значение 10, и вы также знаете, что целые числа быстрее, чем строки, поэтому вы можете дополнительно оптимизировать его, сопоставляя статические значения множителя в динамически заданные с помощью карты и лямбда. – dmitryro
К сожалению, моя фактическая реализация также имеет единицы не SI (например, ярды, мили). Все хотят, чтобы данные отображались в их выборке. Я обновлю свой вопрос, чтобы это отразить. –