在类方法中,我有一组可能的选项用于单个关键字参数,每个参数都有不同的算法来计算某些东西。要检查哪个选项已添加到关键字,我创建了一个if,elif,else链,也可以找到提供的关键字选项。
class MyClass:
def my_method(self, my_parameter, my_keyword='spacial'):
if my_keyword == 'spacial':
print('Cool stuf')
elif my_keyword == 'discoidal':
print('OTHER cool stuff')
elif my_keyword == 'temporal':
print('You get the gist')
else:
print('not in options list')
在我看来,这不是一种非常优雅的编码方式。特别是如果选项列表不断增长。有没有办法省略if,elif,elif,else语句列表?
答案 0 :(得分:2)
使用字典:
def cool_stuff(param):
...
def other_cool_stuff(param):
...
def you_get_the_gist(param):
....
dispatch_mapping = {
'spacial': cool_stuff,
'discoidal': other_cool_stuff,
'temporal': you_get_the_gist
}
其他地方:
def my_method(self, param, keyword='spacial'):
handler = dispatch_mapping.get(keyword)
if handler is None:
raise Exception("No handler for %s" % keyword)
return handler(param)
答案 1 :(得分:0)
至少有一个地方需要划分案件。
在您的情况下,您设置一个字符串,然后再次比较它。
A"方式"这将是替换设置您的字符串直接通过不同的函数/方法调用而不是在函数内部路由它。或者使用字典将字符串映射到函数调用。
答案 2 :(得分:0)
使用字典是一个好主意。但是,另一个选项是反射函数由字符串调用。
class MyClass:
def handle_spacial(self):
print('Cool stuf')
def handle_discoidal(self):
print('OTHER cool stuff')
def handle_temporal(self):
print('You get the gist')
def default(self):
print('not in options list')
def my_method(self, my_parameter, my_keyword='spacial'):
function_name = "handle_"+my_keyword
if hasattr(self, function_name):
getattr(self, function_name)()
else:
self.default()
答案 3 :(得分:0)
创建要以下列方式显示和使用的关键字和选项字典的最佳方法:
>>> class MyClass:
... global mykey_option
... mykey_option={'spacial':'Cool stuf','discoidal':'OTHER cool stuff','temporal':'You get the gist'}
... def my_method(self, my_parameter, my_keyword='spacial'):
... try:
... print(mykey_option[my_keyword])
... except:
... print('not in options list')
...
>>> x = MyClass()
>>> x.my_method(1,'discoidal')
OTHER cool stuff
>>> x.my_method(1,'spacial')
Cool stuf
>>> x.my_method(1,'temporal')
You get the gist
>>> x.my_method(1,'newstring')
not in options list