возврат кортежа из метода - PullRequest
       1

возврат кортежа из метода

3 голосов
/ 02 февраля 2011

Я пишу метод, который возвращает кортеж в случае успеха, но None в случае ошибки. Я еще не завершил работу над None (как возвращение случая неудачи), но это один из вариантов. Можем ли мы вернуть -1,-1 для случая отказа? Я ищу лучший питонический способ добиться этого, чтобы распаковка была легкой.

Пожалуйста, дайте мне знать, как мы можем улучшить его. Псевдокод указан ниже

 def myFunc(self):
     if self.validate() != 0:
         return
     x,y = self.getXY()

     return x,y

Ответы [ 2 ]

14 голосов
/ 02 февраля 2011

Если произошел сбой, почему бы вам не вызвать исключение?

Конечно, вы можете вернуть (-1, -1) как сбой, но, на мой взгляд, это не будет хорошим решением.

Помните, что в Python EAFP (проще просить прощения, чем разрешения) предпочтительнее LBYL (посмотрите, прежде чем вы прыгните).

Это означает, что лучше писать код подгипотеза о том, что все работает, а затем перехват соответствующих исключений.

Ваш код может затем стать

 def myFunc(self):
     if self.validate() != 0:
         raise CustomNotValidatedException()
     x,y = self.getXY()

     return x,y

Я бы улучшил ваш код следующими способами:

  • make self.validate () возвращает 0, если результат не является положительным, так что вы можете изменить второй ряд более питоническим способом:

     if not self.validate():
    
  • удалить промежуточныйx, y переменных, изменив оператор возврата на:

     return self.getXY()
    

Наконец, вы можете просто вызвать исключение внутри getXY() и напрямую использовать этот метод в своем коде.

3 голосов
/ 02 февраля 2011

Если это для выявления ошибок программирования, тогда assert будет чище.

def my_function(self):
    assert self.validate()
    return self.x, self.y

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

def my_function(self):
    if not self.validate():
        raise ValidationError
    return self.x, self.y

Хорошая альтернатива для self.validate () - сама по себе вызывать ошибки проверки: это позволит, например, предоставить сообщение с указанием причины ошибки проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...