目的:从调用者请求的单位(或任何微小的修改)中的函数返回一个值。Pythonic方式以适当的单位获得函数返回值
背景:
我在树莓派3运行的Python 2.7,并使用功能distance()
得到一个旋转编码器已经变成了距离。我需要不同单位的距离,这取决于调用函数的位置。那么,如何将其编写为Python(即简短,易于维护)。
第一次尝试:
我第一次尝试是使用在功能米一个单元,并有很长的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
分支。在这种情况下,如果我想改变计算单位的方式,我必须通过我的代码仔细地对grep
进行计算,并确保我改变了单位在每个实例中的计算方式。一个适当的解决方案只需要改变一次计算。
这可能过于宽泛,但它是我不断遇到的模式。
个人而言,我会去的第二次尝试,但如果我打算用它了很多我内心的C#开发会说做一个扩展方法' .convertTo('ms')'例如。然后你可以执行'encoderReading.convertTo('m')',我认为这个语法看起来非常好。 –
所以你知道你所有的值都是10的幂,而且你也知道整数比字符串快,所以你可以通过使用map和lambda映射乘法器的静态值到动态设置的值来进一步优化它。 – dmitryro
不幸的是,我的实际实施也有非SI单位(即码,英里)。每个人都希望数据以他们的单位显示。我会更新我的问题以反映这一点。 –