我试图用更像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))
`
答案 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(行)。
谢谢你的回答。我没有意识到我实际上在运行该方法而不是定义值。