我有一个函数main
,给定一个字符串,应该选择许多其他函数之一,用一些特定的args
和kwargs
调用它,然后返回它的结果。最直接的实现是
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")
但同样,这会使代码的可读性降低。
我想知道是否可以定义类似于字典迭代器的东西:指定了所有键值对,但该值仅在拾取时进行评估。也许有一个更好的主意。
提示?