Двойной возврат в методе класса Python - PullRequest
0 голосов
/ 07 апреля 2011

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

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 (name) вызывается и конструктор BuildResult (True, installData) запускается
  3. Последний оператор return также выполняется

Ответы [ 2 ]

7 голосов
/ 07 апреля 2011

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

1 голос
/ 07 апреля 2011

Когда 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)
...