2017-01-06 2 views
-1

В принципе, я хочу оставить открытым вариант для любого из следующих команд, направленных на моей slackbot:Есть ли более pythonic способ передать несколько возможных исключений?

@torbot

@torbot [команда]

@torbot [команда] [аргументы ]

Ниже приведено то, что я использую сейчас, но выглядит некрасиво. По моему опыту, обычно, когда что-то кажется уродливым, это означает, что существует более интуитивный способ сделать то же самое.

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 
+0

дать 'except' код ошибки, например' 'ValueError' или FileNotFoundError' – WhatsThePoint

+0

Почему бы не просто проверить' LEN (__ input.split()) ', чтобы увидеть, сколько«слова»ар Эйн вход, а затем использовать это знания, чтобы решить, какое дело обрабатывать? –

+1

О pythonicity: с помощью python вы не используете аксессоров. Они бесполезны, потому что у python есть понятие вычисленных свойств. Встроенный. – spectras

ответ

4

Просто разделить раз и испытание, если список достаточно длинный:

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 для выражения индексирования, в котором список может быть недостаточно длинным.

Кроме того, я бы рекомендовал не использовать имена двухзначных символов __. Используйте их только в том случае, если вы хотите, чтобы ваш класс был подклассифицирован сторонним кодом, где важно, чтобы внутренняя реализация не была случайно затронута каким-либо подклассом.

Смежные вопросы