将我开发的所有模块放入主程序时遇到问题.我创建的切换词典如下所示:
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
(没有任何参数,它们已知),以确保仅在需要时调用该函数:
switcher = { 0: lambda : vertical.Vertical_Tank(level, area), 1: lambda : horiz.Horiz_Cylinder_Dished_Ends(dish, radius, level, length), 2: lambda : strapping.Calc_Strapped_Volume(Strapping_Table, level), 3: lambda : poly.Fifth_Poly_Calcs(Tank_Number) }
然后在您返回时调用,并将错误消息作为返回它的lambda:
return switcher.get(Tank_Shape, lambda : "ERROR: Tank type not valid")()
如上所述,在字典构造期间将调用这些函数.除此之外,我在这里看到另外两个问题:
switcher
在每次调用函数时重新定义Tank_Shape_Calcs
,这通常不是一个好主意.
要求所有参数都被传递(由于它们被定义为定位),当只需要少数几个时,这就是为什么我们有*args
:-)
如果我对你在做什么的理解是正确的,我会的功能外移动切换器,作为Tank_Shape
对function
对象的映射:
switcher = { 0: vertical.Vertical_Tank, 1: horiz.Horiz_Cylinder_Dished_Ends, 2: strapping.Calc_Strapped_Volume, 3: poly.Fifth_Poly_Calcs }
然后,定义Tank_Shape_Calcs
将多余的参数作为元组*args
:
def Tank_Shape_Calcs(Tank_Shape, *args): return switcher.get(Tank_Shape, lambda *_: "ERROR: Tank type not valid")(*args)
并在.get
它之后调用你的功能.
这也取消了Jean的诀窍来定义一个lambda
in .get
但是这样做*_
以便允许它被许多args调用(因此被忽略).
您在代码中所做的是使用整数键(0-3)创建字典,并将函数结果创建为值.因此,您首先调用所有函数,然后访问这些函数的返回值.我会将您的代码更改为:
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,)) } func, args = switcher.get(Tank_Shape, (None, None)) if func is not None: return func(*args)
在这里,您首先获得要使用相应参数调用的函数并调用它.