当前位置:  开发笔记 > 编程语言 > 正文

在switch字典中执行函数

如何解决《在switch字典中执行函数》经验,为你挑选了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)
    }
    return switcher.get(Tank_Shape, "ERROR: Tank type not valid")

罐形状在主文件中设置为每个罐的循环.第一辆坦克Tank_Shape = 2我希望它能执行这个Calc_Strapped_Volume()功能.

我曾尝试测试它,和切换功能绝对是读书Tank_Shape2.此外,如果我将函数更改为字符串,它将打印出正确的字符串.

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

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



1> Jean-Françoi..:

构建字典时执行所有功能,而不是在访问密钥时执行.

您需要使用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")()


或_functools.partial_而不是lambda
@ jpmc26我想你是以友好的方式取笑我.那么29k并不是来自python当然.我承认我不知道Python中的一切.Martijn可能是那个人.
总是乐意为服务:-),_partial_非常适合回调.我自己经常和_lambda一起犯罪,但是 - 恕我直言,在这种情况下,_partial_看起来有点清洁.味道很重要.

2> Jim Fasaraki..:

如上所述,在字典构造期间将调用这些函数.除此之外,我在这里看到另外两个问题:

switcher在每次调用函数时重新定义Tank_Shape_Calcs,这通常不是一个好主意.

要求所有参数都被传递(由于它们被定义为定位),当只需要少数几个时,这就是为什么我们有*args:-)

如果我对你在做什么的理解是正确的,我会的功能外移动切换器,作为Tank_Shapefunction对象的映射:

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的诀窍来定义一个lambdain .get但是这样做*_以便允许它被许多args调用(因此被忽略).


整洁的解决方案,但当键就像索引一样使用`dict`似乎是一种耻辱,为什么不把`switcher`改为`list`?
不知道OP究竟取决于@Chris_Rands,但是这里的dict允许轻松处理通过`.get`不存在的键的情况.你可以用一个列表来做,但它可以说看起来更笨拙.此外,字典在此直观地更适用于切换语句的模拟.

3> BloodyD..:

您在代码中所做的是使用整数键(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)

在这里,您首先获得要使用相应参数调用的函数并调用它.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有