python,将if / elif替换为字典

时间:2013-11-13 15:30:26

标签: 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'
  elif queue == 'baz':
    username = 'baz'
    password = 'wnkyVsBI'
  ...
  dosomething(queue)

def main():
    checkme('foo')
    checkme('bar')
    checkme('baz')

5 个答案:

答案 0 :(得分:5)

你可以这样做:

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. 

答案 1 :(得分:3)

看起来你依赖于副作用,尤其是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]

答案 2 :(得分:2)

试试这个:

passwords = {'foo':'vlTTdhML', 'bar':'xneoYb2c', 'baz':'wnkyVsBI'}
username, password = queue, passwords[queue]

以上假设每个用户都在字典中有一个密码。如果情况并非如此,那么最好安全地使用它:

username, password = queue, passwords.get(queue, None)

无论哪种方式,您都可以在最后调用dosomething(queue)。正如问题中目前所述,始终会调用dosomething

答案 3 :(得分:1)

你可以这样做:

  

{'foo':{'username':'foo','password':'vlTTdhML'}}

只需按照您的意愿添加词典。

答案 4 :(得分:1)

嵌套词典可以解决问题。

设置用户名和密码:

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"