python,将if/elif替换为dictionary

python,将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'

各位, 如何使用字典重写“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'
  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
语句全部失败的情况下执行?