小编典典

if语句过多

python

我有一些话题要讨论。我有一个24 ifs /
elifs的代码片段。Operation是我自己的类,表示类似于的功能Enum
这是一段代码:

if operation == Operation.START:
    strategy = strategy_objects.StartObject()
elif operation == Operation.STOP:
    strategy = strategy_objects.StopObject()
elif operation == Operation.STATUS:
    strategy = strategy_objects.StatusObject()
(...)

从可读性的角度来看,我有些担心。将其更改为24类并使用多态性更好吗?我不相信这将使我的代码可维护…一方面,这些ifs很清楚,应该很容易理解,另一方面,ifs太多了。

我的问题相当笼统,但是我正在用Python编写代码,所以我不能使用switch

你怎么看?


更新

重要的一点是StartObject()StopObject()并且StatusObject()是构造函数,我想分配一个对象以进行strategy引用。


阅读 222

收藏
2020-12-20

共1个答案

小编典典

您可以使用字典。字典存储引用,这意味着函数完全可以使用,如下所示:

operationFuncs = {
    Operation.START: strategy_objects.StartObject
    Operation.STOP: strategy_objects.StopObject
    Operation.STATUS: strategy_objects.StatusObject
    (...)                  
}

最好有一个默认操作以防万一,因此在运行它时,请使用atry except并处理异常(即,与else子句等效的对象)

try:
    strategy = operationFuncs[operation]()
except KeyError:
    strategy = strategy_objects.DefaultObject()

或者,使用字典的get方法,如果找不到您提供的键,则该方法允许您指定默认值。

strategy = operationFuncs.get(operation(), DefaultObject())

请注意,将它们存储在字典中时不包括括号,而在调用字典时才使用它们。同样,这要求它必须是Operation.START可散列的,但情况确实如此,因为您将其描述为类似于ENUM的类。

2020-12-20