在开关字典中执行函数

2024-10-01 13:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

当我把我开发的所有模块都放到主程序中时,我遇到了一个问题。我创建的开关字典如下所示:

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。另外,如果我把函数改成字符串,它将输出正确的字符串。在

问题是函数似乎是按顺序执行的,直到调用了正确的函数。这会导致错误,因为我使用的数据只能使用正确的函数。在

有没有办法只执行正确的功能?在


Tags: 函数numbertablecalcarealevellengthshape
3条回答

所有函数都是在构建字典时执行的,而不是在访问键时执行的。在

您需要使用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返回:

^{pr2}$

如前所述,函数将在字典构造期间被调用。除此之外,我还看到了另外两个问题:

  • 在每次调用函数Tank_Shape_Calcs时重新定义switcher,这通常不是一个好主意。在
  • 当只需要少数几个参数时,需要传递所有参数(由于它们的定义是位置的),这就是为什么我们有*args:-)

如果我对您所做的理解是正确的,我会将switcher移到函数之外,作为Tank_Shape到{}对象映射:

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的元组:

^{pr2}$

并在.get后调用它。在

这也利用了Jean在.get中定义lambda的技巧,但是使用*_来定义lambda,这样就可以用许多参数调用它(这些参数因此被忽略)。在

您在代码中所做的是创建一个包含整数键(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)

在这里,首先得到要用相应参数调用的函数并调用它。在

相关问题 更多 >