python switch代码总是匹配,即使它不应该这样做

时间:2018-03-07 17:22:22

标签: python

我试图用更像java开关的东西替换python中的一个较大的if-elif块。我的理解是这应该更快一点,我们正在解析大量数据,所以如果我能提高速度,我会接受它。然而,正在发生的事情是代码总是表现为好像密钥是“存款”,即使对于不是的条目也是如此。 “func =”行是为了验证我正确得到的东西。我可能不会将结果返回到func,因为我的目标是填充结果列表。 即使一个不存在,切换器.get总是找到匹配,我做错了什么?

`def parsePollFile(thisFile):
    line = ''
    switcher = {
        'deposits': deposits(line)
    }
    try:
        reader = csv.reader(open(thisFile, 'r'))
        for line in reader:
            try:
                if line[2] == "D":
                    func = switcher.get(line[0], lambda: 'invalid key')
                    print('key: {} -- {}\n'.format(line[0],func))
            except IndexError:
                continue
    except Exception as e:
        print("exception {}\n".format(e))
`

2 个答案:

答案 0 :(得分:2)

你的问题是代码

switcher = {'deposits': deposits(line)}

不在字典中创建一个值为deposits函数对象的键。 'deposits': deposits(line)实际运行deposits函数,并将返回值存储为'deposits'键的值。您需要在字典中存储函数对象。

由于你的函数接受了参数,这有点棘手。有几种方法可以解决这个问题,但最简单的方法是将函数调用包装在另一个函数中

switcher = {'deposits': lambda: deposits(line)}

然后你会像这样使用字典

func = switcher.get(line[0], lambda: 'invalid key')
func()

答案 1 :(得分:0)

我的解决方案来自评论和答案。我将存款'存款(行)更改为存款'存款,然后在找到匹配时运行func(行)。

谢谢你的回答。我没有意识到我实际上在运行该方法而不是定义值。