我有一系列形式的条件:
if ':' in particle:
do something
elif 'eq' in particle:
do something else
elif 'lt' in particle:
do another thing
elif 'le' in particle:
etc.
elif 'gt' in particle:
etc., etc.
elif 'ge' in particle:
etc., etc., etc.
elif 'ne' in particle:
more etc.
我想使用字典映射模式来实现它,但是我遇到了密钥问题。
我试过了:
def case_evaluator(particle):
switcher = {
':' in particle: do something,
'eq' in particle: do something else,
'lt' in particle: do another thing,
...
}
return switcher.get(particle, "nothing")
但是,我一直没有得到什么。"什么东西什么都没有?
这看起来应该很简单,但唉......
答案 0 :(得分:2)
你走在正确的轨道上。这称为函数调度。 它需要看起来更像这样:
def case_evaluator(particle):
switcher = {
':': do_something,
'eq': do_something_else,
'lt': do_another_thing,
...
}
return switcher.get(particle, lambda: "nothing")()
其中do_something等都是不带参数的函数。 lambda x: "nothing"
是一个lambda函数,它总是返回“nothing” - 如果在particle
中找不到switcher.keys()
,则它是默认函数。
答案 1 :(得分:2)
您可能希望拥有一个将字符映射到函数的字典。
char_function_dict = {
':': colon_function,
'eq': eq_function,
'lt': lt_function
# ...and so on...
}
然后,您可以迭代此字典中的键值对。
def apply_function(particle):
for char, function in char_function_dict.items():
if char in particle:
function()
但请注意,此结构并未真正使用特定于字典的任何内容,并且不保留检查字符的顺序。使用2元素元组列表可能更简单。
char_functions = [
(':', colon_function),
('eq', eq_function),
('lt', lt_function)
# ...and so on...
]
def apply_function(particle):
for char, function in char_functions:
if char in particle:
function()
break # so successive functions are not run
设置这些结构中的任何一个以允许将参数和/或关键字参数传递给函数是很容易的:
def apply_function(particle, *args, **kwargs):
for char, function in char_functions:
if char in particle:
function(*args, **kwargs)
break