2

伙计们,你会如何用字典重写'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')
4

5 回答 5

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. 
于 2013-11-13T15:33:58.580 回答
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]
于 2013-11-13T15:34:34.560 回答
3

尝试这个:

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

以上假设每个用户的字典中都有一个密码。如果不是这种情况,最好安全使用并使用:

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

无论哪种方式,您都可以简单地dosomething(queue)在最后调用。正如问题中当前所述,dosomething总是被调用。

于 2013-11-13T15:34:42.363 回答
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"
于 2013-11-13T15:37:46.607 回答
1

你可以这样做:

{'foo': {'用户名': 'foo', '密码': 'vlTTdhML'}}

并根据需要继续添加字典。

于 2013-11-13T15:35:25.330 回答