如果,elif,elif,else'来自keyword-arguments

时间:2014-12-02 16:43:47

标签: python keyword-argument

在类方法中,我有一组可能的选项用于单个关键字参数,每个参数都有不同的算法来计算某些东西。要检查哪个选项已添加到关键字,我创建了一个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语句列表?

4 个答案:

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