2008-09-01 5 views
57

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

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

Связанный вопрос: Is it pythonic for a function to return multiple values?

+0

Я добавил ссылку на связанный с этим вопрос – jfs 2009-01-08 18:32:47

ответ

116
def f(in_str): 
    out_str = in_str.upper() 
    return True, out_str # Creates tuple automatically 

succeeded, b = f("a") # Automatic tuple unpacking 
+1

Я хотел бы добавить, что данный подход работает с массивами и матрицами также – Nicholas 2014-08-04 13:37:56

7

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

15

Верните кортеж.

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

success, modified_string = f(something) 
+0

Мой партнер спорит со мной о погоде должен добавить `(` и `)`, когда хотите вернуть несколько значений. Когда я пишу код в Pycharm, идеал показывает, что он носит строки, где возвращаются несколько значений с помощью `()`, но мы не можем найти правило стиля кода в pep8. Как вы думаете об этом? Спасибо. – 2017-08-11 06:55:39

28

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

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

+1

Согласовано. Функции Pythonic не должны возвращать коды, указывающие на «успех/неудачу», когда он намного более вероятен, чем другой. Просто бросьте исключение в исключительном случае. Это означает, что при необходимости нужно вернуть кортеж: «return a, b, c» – 2008-10-10 19:19:32

3

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

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

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

  • Нет связанных вопросов^_^