python,将if/elif替换为dictionary
各位, 如何使用字典重写“checkme”函数中的if/elifpython,将if/elif替换为dictionary,python,Python,各位, 如何使用字典重写“checkme”函数中的if/elif def dosomething(queue): ... def checkme(queue): """ Consume Message """ if queue == 'foo': username = 'foo' password = 'vlTTdhML' elif queue == 'bar': username = 'bar' password = 'xneoYb2c'
def dosomething(queue):
...
def checkme(queue):
""" Consume Message """
if queue == 'foo':
username = 'foo'
password = 'vlTTdhML'
elif queue == 'bar':
username = 'bar'
password = 'xneoYb2c'
elif queue == 'baz':
username = 'baz'
password = 'wnkyVsBI'
...
dosomething(queue)
def main():
checkme('foo')
checkme('bar')
checkme('baz')
你可以这样做:
CHECK_ME = {'foo': 'vlTTdhML', 'bar': 'xneoYb2c', 'baz': 'wnkyVsBI'}
def checkme(queue):
username, password = queue, CHECK_ME.get(queue)
#May be some more check here, like
if not password:
print 'password is none'
#Or do something more relevant here
#rest of the code.
看起来您依赖的是副作用,尤其是
dosomething(queue)
部分,所以我假设在我的解决方案中处理得很好,但我更喜欢不依赖副作用的方式
def checkme(queue):
class to_do_dict(dict):
def __missing__(self, itm):
dosomething(itm)
to_do = to_do_dict({
"foo":("foo", "v1TTdhML"),
"bar":("bar", "xneoYb2c")})
username, password = to_do[queue]
试试这个:
passwords = {'foo':'vlTTdhML', 'bar':'xneoYb2c', 'baz':'wnkyVsBI'}
username, password = queue, passwords[queue]
以上假设字典中每个用户都有一个密码。如果不是这样,最好谨慎使用:
username, password = queue, passwords.get(queue, None)
无论哪种方式,您都可以在最后调用dosomething(queue)
。如问题中当前所述,dosomething
始终被调用。您可以执行以下操作:
{'foo':{'username':'foo','password':'vlTTdhML'}
只要继续添加您喜欢的字典。嵌套字典就可以了 要设置用户名和密码,请执行以下操作:
queue = {}
queue["foo"] = {"username": "foo", "password": "vlTTdhML" }
queue["bar"] = {"username": "bar", "password": "xneoYb2c" }
并检查用户名/密码是否存在:
if queue.get("foo"):
username = queue["foo"]["username"]
password = queue["foo"]["password"]
else:
# username does not exist, so do something
print "username does not exist"
当
queue
缺少密钥时,无法处理调用dosomething(queue)
的请求。@EMS问题中没有说明,问题只是询问如何用字典替换if/elif
。再看一下问题中的代码,dosomething(queue)
调用在最后执行,如果queue
丢失并不重要-事实上,在我的代码之后将调用复制粘贴到dosomething
。请重新考虑否决票。我想先得到OP的明确澄清,但我明白你的意思。我将在OP中添加一条评论。从我的观点来看,处理失败案例是这个问题的唯一部分,它不是这个问题的许多其他体现的重复,也是唯一需要非平凡解决方案的部分。如果你的要求是正确的,我肯定会投票赞成。@ EMS,当你在考虑的时候,考虑取消这个问题的下注,因为它是(可用的信息),这是不合理的,看来你误解了原来的问题我认为我是清楚的。如果OP希望dosomething()
调用作为else
块发生,以防queue
不在用户名/密码对的dict
中,那么我确实认为您的答案应该被否决。从问题的写作方式来看,我不清楚OP是否有意这样做,所以我要求澄清。如果OP澄清无论队列是什么,dosomething
应该始终在If
/else
块之后执行,然后,我将撤销否决票,并投票以重复方式结束该问题。您能否澄清:调用dosomething
是否应该总是在整个块完成后进行?或者它应该仅在基于队列的if
语句全部失败的情况下执行?