【问题标题】:Are python 'switches' (dict) supposed to call every func inside?python'switches'(dict)是否应该调用内部的每个函数?
【发布时间】:2019-04-03 23:58:10
【问题描述】:

我试图使用 python 开关编写一些代码,在 dict 中模拟,如:Replacements for switch statement in Python? [第二个答案,由 Nick]

当我测试时,由于某种原因,里面的所有函数都被调用了,尝试了一个简单的代码来查看问题所在,然后问题又出现了。见:

def switch(f):
    print('Switch got: ', f)
    var = {
        1: func1(),
        2: func2(),
        3: func3()
        }.get(f,False)
    return var

def func3():
    fb = 'Func3 called'
    print(fb)
    return fb

def func1():
    rsp = 'Func1 called'
    print(rsp)
    return rsp

def func2():
    rsp = 'Func2 called'
    print(rsp)
    return rsp

var = switch(1)
print(var)

我的预期回报只是:

Switch got:  1
Func1 called

相反,我得到了:

Switch got:  1
Func1 called
Func2 called
Func3 called
Func1 called

我从中得到的是,python 似乎在调用正确的键(示例中的 1)之前运行 dict 中的每个函数。

这是 Python 中的预期行为吗?

有没有办法只调用与键对应的函数?

【问题讨论】:

  • 更改为def switch(f): print('Switch got: ', f) func = { 1: func1, 2: func2, 3: func3 }.get(f) return func() if func is not None else False
  • The third answer on that page 看起来正是您所需要的
  • @Eric 不确定我是否可以使用 lambda,因为实际代码比发布的更复杂。但我明白你的意思。谢谢
  • “由于某种原因,里面的所有函数都被调用了”,因为你明确地调用它们
  • @ZeCarioca: lambda: my_complex_code()

标签: python switch-statement


【解决方案1】:

这是 Python 中的预期行为吗?

是的。

有没有办法,只调用与键对应的函数?

在创建调度字典时不要真正调用函数:

def switch(k):
    print('Switch got: ', k)
    func = {
        1: func1,
        2: func2,
        3: func3,
    }.get(k, bool)
    var = func()
    return var

【讨论】:

  • 我认为让它返回调用类型 bool 作为默认值的结果充其量是模糊的。
【解决方案2】:

在调用函数“switch”时初始化该字典的行为也会调用函数。试试这样的,

def switch(f):
    print('Switch got: ', f)
    var = {
        1: func1,
        2: func2,
        3: func3
        }.get(f,False)
    if not var:
      return false
    return var()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多