仅在选中时评估值的字典

时间:2018-06-04 18:28:23

标签: python dictionary

我有一个函数main,给定一个字符串,应该选择许多其他函数之一,用一些特定的argskwargs调用它,然后返回它的结果。最直接的实现是

def main(string):
    if string == "a1":
        return a(1)
    elif string == "a2":
        return a(2)
    elif string == "b":
        return b("foo", symbol=True)
    # ...
    elif string == "y":
        return y()

    assert string == "z", "Illegal string '{}'.".format(string)
    return z("bar", 25)

但我不喜欢这个难看的巨大条件。可读性更高

def main(string):
    d = {
        "a1": a(1),
        "a2": a(2),
        "b": b("foo", symbol=True),
        # ...
        "z": z("bar", 25),
        }
    return d[string]

这也消除了密钥elif'两次可能的拼写错误 - 很好。 不幸的是,这会初始化字典中的每个条目,只是为了立即扔掉几乎所有条目。在d之外定义main并不是一个很大的改进,因为main只执行了几次。添加一些lambda的作品

def main(string):
    d = {
        "a1": lambda: a(1),
        "a2": lambda: a(2),
        "b": lambda: b("foo", symbol=True),
        # ...
        "z": lambda: z("bar", 25),
        }
    return d[string]()

main("a")

但同样,这会使代码的可读性降低。

我想知道是否可以定义类似于字典迭代器的东西:指定了所有键值对,但该值仅在拾取时进行评估。也许有一个更好的主意。

提示?

0 个答案:

没有答案