当您有多个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中抓住其余的
答案 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)
除此之外,你的方法很好,我肯定会这样做。