当我把我开发的所有模块都放到主程序中时,我遇到了一个问题。我创建的开关字典如下所示:
def Tank_Shape_Calcs(Tank_Shape, level, area, dish, radius, length, Strapping_Table, Tank_Number):
switcher = {
0: vertical.Vertical_Tank(level, area),
1: horiz.Horiz_Cylinder_Dished_Ends(dish, radius, level, length),
2: strapping.Calc_Strapped_Volume(Strapping_Table, level),
3: poly.Fifth_Poly_Calcs(Tank_Number)
}
return switcher.get(Tank_Shape, "ERROR: Tank type not valid")
在主文件中为每个水箱在循环中设置水箱形状。第一个坦克有Tank_Shape = 2
,所以我希望它执行Calc_Strapped_Volume()
函数。在
我试过测试它,切换器函数肯定是将Tank_Shape
读为2
。另外,如果我把函数改成字符串,它将输出正确的字符串。在
问题是函数似乎是按顺序执行的,直到调用了正确的函数。这会导致错误,因为我使用的数据只能使用正确的函数。在
有没有办法只执行正确的功能?在
所有函数都是在构建字典时执行的,而不是在访问键时执行的。在
您需要使用
lambda
(没有任何参数,它们已经是已知的)以确保仅在需要时调用函数:然后在返回时调用,并将错误消息作为lambda返回:
^{pr2}$如前所述,函数将在字典构造期间被调用。除此之外,我还看到了另外两个问题:
Tank_Shape_Calcs
时重新定义switcher
,这通常不是一个好主意。在*args
:-)如果我对您所做的理解是正确的,我会将switcher移到函数之外,作为}对象映射:
Tank_Shape
到{然后,定义
^{pr2}$Tank_Shape_Calcs
,将多余的参数作为带有*args
的元组:并在
.get
后调用它。在这也利用了Jean在
.get
中定义lambda
的技巧,但是使用*_
来定义lambda
,这样就可以用许多参数调用它(这些参数因此被忽略)。在您在代码中所做的是创建一个包含整数键(0-3)和函数结果作为值的字典。因此,首先调用所有函数,然后访问这些函数的返回值。我将更改您的代码如下:
在这里,首先得到要用相应参数调用的函数并调用它。在
相关问题 更多 >
编程相关推荐