字典映射中的表达式

时间:2016-02-05 21:18:13

标签: python dictionary switch-statement conditional mapper

我有一系列形式的条件:

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")

但是,我一直没有得到什么。"什么东西什么都没有?

这看起来应该很简单,但唉......

2 个答案:

答案 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