Цель: вернуть значение из функции в единицах (или любой тривиальной модификации), запрошенной вызывающим.
Фон:
Я запускаю Python 2.7 на малине 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()
, которые используют "m/s" в качестве базового блока и нуждаются в аналогичном аргументе units
. По моему опыту, хорошо структурированная программа не включает в себя абзац ветвей elif
перед каждым оператором return. В этом случае, если бы я хотел изменить способ вычисления единиц, мне пришлось бы тщательно grep
через мой код и убедиться, что я изменяю, как единицы вычисляются в каждом экземпляре. Правильное решение потребовало бы только однократного изменения расчета.
Это возможно слишком широко, но это шаблон, в котором я продолжаю работать.