关于python:有没有更多的方法来传递多个可能的异常?

Is there a more pythonic way to pass over multiple possible exceptions?

本问题已经有最佳答案,请猛点这里访问。

基本上,我想为针对我的slackbot的以下任何命令保留open选项:

@torbot

@torbot [command]

@torbot [command] [arguments]

下面是我现在一直使用的,但看起来很难看。根据我的经验,通常当某件事情看起来很难看时,这意味着有一种更直观的方法来做同样的事情。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class TorbotCommand(object):
def __init__(self, input):
    self.__input = input

    # TODO: There has to be a better way..
    try:
        self.__command_string = self.__input['text'].split(' ', 1)[1].strip().lower()
    except:
        self.__command_string = None
        pass

    try:
        self.__command = self.__command_string.split(' ', 1)[0]
    except:
        self.__command = None
        pass

    try:
        self.__text = self.__command_string.split(' ', 1)[1]
    except:
        self.__text = None
        pass

def getCommand(self): return self.__command
def getText(self): return self.__text
def getInput(self): return self.__input


只需拆分一次,然后测试列表是否足够长:

1
2
3
4
5
6
7
8
9
10
def __init__(self, input):
    self.__input = input

    parts = input['text'].split(None, 1)
    self.__command = parts[0] if parts else None
    self.__command_string = parts[1].lower() if len(parts) > 1 else None

    self.__text = None
    if self.__command_string:
        self.__text = self.__command_string.partition(' ')[-1]

我使用None作为str.split()的第一个参数,将其拆分为任意空白;这也为您提供了一个自动条带。

如果您仍然需要处理异常,请不要使用毯子except:块。只捕获特定的异常,例如索引表达式的IndexError,其中列表可能不够长。

另外,我建议不要使用__双下划线名称。只有当您希望类被第三方代码子类化时才使用这些代码,在这种情况下,重要的是内部实现不会意外地受到子类定义的影响。