J.G*_*ade 18 python dictionary function
将我开发的所有模块放入主程序时遇到问题.我创建的切换词典如下所示:
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")
Run Code Online (Sandbox Code Playgroud)
罐形状在主文件中设置为每个罐的循环.第一辆坦克Tank_Shape = 2我希望它能执行这个Calc_Strapped_Volume()功能.
我曾尝试测试它,和切换功能绝对是读书Tank_Shape的2.此外,如果我将函数更改为字符串,它将打印出正确的字符串.
问题是函数似乎是按顺序执行的,直到调用了正确的函数.这会导致错误,因为我使用的数据只能使用正确的函数.
有没有办法只执行正确的功能?
Jea*_*bre 38
构建字典时执行所有功能,而不是在访问密钥时执行.
您需要使用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)
}
Run Code Online (Sandbox Code Playgroud)
然后在您返回时调用,并将错误消息作为返回它的lambda:
return switcher.get(Tank_Shape, lambda : "ERROR: Tank type not valid")()
Run Code Online (Sandbox Code Playgroud)
Jim*_*ard 18
如上所述,在字典构造期间将调用这些函数.除此之外,我在这里看到另外两个问题:
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
}
Run Code Online (Sandbox Code Playgroud)
然后,定义Tank_Shape_Calcs将多余的参数作为元组*args:
def Tank_Shape_Calcs(Tank_Shape, *args):
return switcher.get(Tank_Shape, lambda *_: "ERROR: Tank type not valid")(*args)
Run Code Online (Sandbox Code Playgroud)
并在.get它之后调用你的功能.
这也取消了Jean的诀窍来定义一个lambdain .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)
Run Code Online (Sandbox Code Playgroud)
在这里,您首先获得要使用相应参数调用的函数并调用它.