如果条件具有不同的行为评估,则有效Python多重

时间:2014-01-08 21:39:17

标签: python

当您有多个chained-if-conditions要检查时,有没有办法有效地(视觉/组织而不是性能)编码可能的操作?

以下是人们现在如何做到这一点。 例如:

variable = 0 # can be 0 or 1
variable1 = 'a' # can be 'a', 'b'

if variable == 0 and variable1 == 'a':
    print('1')
elif variable == 0 and variable1 == 'b':
    print('2')
elif variable == 1 and variable1 == 'c':
    print('3')
elif variable == 1 and variable1 == 'd':
    print('4')

或者如果循环你可以做NESTED。

但是当你有:

时,这显然变得非常难以忍受
variable = True # can be True or False
variable1 = 'a' # can be 'a', 'b', 'c'
variable2 = '1a' # can be '1a', '1b', '1c'
variableNth = 'aaa' # can be 'aaa', 'bbb', 'ccc'... where Nth is large
if variable == 1 and variable1 = 'a' and variable2 = '1a' and variableth = 'aaa':
   print('yay!')
elif variable .... (you get the picture)

那么,考虑到所有组合的可能性,是否有一种有效的方法来循环所有可能的结果并编写所需的行为?

我目前的想法是:

variable = 0 # can be 0 or 1
variable1 = 'a' # can be 'a', 'b'

# slightly more visually appealing? 
results_dict = {}
results_dict[str('0') +str('a')] = result1_func
results_dict[str('0') +str('b')] = result2_func
results_dict[str('1') +str('a')] = result3_func
results_dict[str('1') +str('b')] = result4_func
# and for more possibilities:
results_dict[str('0') + str('a') + str('aaa')] = result5_func

def result1_func(*arg, **karg):
    print('yay!')

def result2_func(*arg, **karg):
    print('no')
def result3_func(*arg, **karg):
    print('3')
def result3_func(*arg, **karg):
    print('4')

def func_else(*arg, **karg):
    print('5')

你可以通过以下方式使用它:

>>>> func = results_dict[str(variable) + str(variable1)]
>>>> func(variable, variable1)

但现在处理通用的“其他”案件更令人讨厌,如果他们没有被抓住:

>>>> func = results_dict.get(str(variable) + str(variable1), func_else) 

这是要走的路吗?那里有解决方案吗? (框架我可以继承做我想做的事情吗?)

编辑以澄清func_else:     func_else可用于不写下所有可能性的情况:

variable = 0# can be 0 or 1
variable1 = 'a' # can be 'a', 'b', 'c'

但我只关心组合(0和a)或('1'和'c')。 然后我不需要填写所有6种可能性,只需2,然后在我的func_else中抓住其余的

2 个答案:

答案 0 :(得分:0)

只需使用元组作为键并直接构建字典

func_dict = {(0, '1') : func1, ....}
.....
result = func_dict[(variable, variable1)](<params>)

答案 1 :(得分:0)

您可以通过继承dict来处理默认值:

class Controller(dict):
    def __init__(self, default=None):
        self._default = default
    def __getitem__(self, key):
        if key in self:
            return super(Controller, self).__getitem__(key)
        return self._default

它可以和你使用的字典几乎一样使用,除了你必须用默认函数初始化它:

results_dict = Controller(default=fn)

func = results_dict[str(variable) + str(variable1)] # will always work
func(variable, variable1)

除此之外,你的方法很好,我肯定会这样做。