Двойной возврат в методе класса python

#python #return-value

#python #возвращаемое значение

Вопрос:

Когда я вызываю следующий метод, выполняются два возврата, и я не могу понять почему.

 def Build(self, name = None):
    if self.buildData:
        try:
            installData = self.buildData.Build(name)
            return BuildResult(True, installData)
        except:
            pass
    else:
        Log("Application has no <build> data")
    return BuildResult(False, None)
  

Что происходит, это:

  1. Метод вызывается с допустимой строкой, скажем, «abc»
  2. вызывается self.buildData.Build(имя) и запускается конструктор BuildResult(True, installData)
  3. Также выполняется последняя инструкция return

Комментарии:

1. Пожалуйста, исправьте ваше предложение «except:», чтобы напечатать исключение, которое там фактически возникло. Это поможет вам увидеть, что происходит.

2. Что такое self.buildData ? Вы уверены, что это не обратная ссылка на родительский класс?

Ответ №1:

Ну, я предполагаю, что BuildResult() завершается с ошибкой, передается исключение, и вы переходите ко второму возврату. Вы можете легко протестировать это, просто добавив некоторую отладочную печать в except — никогда не отключайте исключения 🙂

Ответ №2:

При return BuildResult(True, installData) выполнении BuildResult(True, installData ) вычисляется первым. Я предполагаю, что эта функция вызывает исключение, которое перехватывается и pass редактируется. После этого return BuildResult(False, None) выполняется.

Вы должны увидеть, какое исключение вызвано, и обработать его должным образом.

Я бы переписал функцию следующим образом:

 def Build(self, name = None):
    if self.buildData:
        try:
            installData = self.buildData.Build(name)
        except: # TODO: catch only expected exception
            pass
        return BuildResult(True, installData)
    else:
        Log("Application has no <build> data")
    return BuildResult(False, None)