Какой лучший способ вернуть несколько значений из функции в Python? - PullRequest
63 голосов
/ 02 сентября 2008

У меня есть функция, где мне нужно что-то сделать со строкой. Мне нужна функция для возврата логического значения, указывающего, успешно ли выполнена операция, и мне также нужно вернуть измененную строку.

В C # я бы использовал параметр out для строки, но в Python нет эквивалента. Я все еще очень плохо знаком с Python, и единственное, о чем я могу думать, это вернуть кортеж с логической и модифицированной строкой.

Смежный вопрос: Является ли Pythonic функцией, возвращающей несколько значений?

Ответы [ 5 ]

124 голосов
/ 02 сентября 2008
def f(in_str):
    out_str = in_str.upper()
    return True, out_str # Creates tuple automatically

succeeded, b = f("a") # Automatic tuple unpacking
28 голосов
/ 02 сентября 2008

Почему бы не выдать исключение, если операция не удалась? Лично я склонен считать, что если вам нужно вернуть более одного значения из функции, вам следует пересмотреть, правильно ли вы делаете вещи или используете объект.

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

16 голосов
/ 02 сентября 2008

Вернуть кортеж.

def f(x):
    # do stuff
    return (True, modified_string)

success, modified_string = f(something)
7 голосов
/ 02 сентября 2008

Возврат кортежа - это обычный способ сделать это в Python.

3 голосов
/ 02 сентября 2008

Создание исключения для сбоя является хорошим способом для продолжения, и если вы возвращаете много разных значений, вы можете вернуть кортеж. Для конкретного случая, на который вы ссылаетесь, я часто использую промежуточный подход: возвращать измененную строку в случае успеха и возвращать None в случае неудачи. Мне достаточно невосстановленного программиста на Си, чтобы захотеть вернуть нулевой указатель на символ при ошибке.

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

...