Какой лучший способ вернуть несколько значений из функции в Python?

StackOverflow https://stackoverflow.com/questions/38508

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

success, modified_string = f(something)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top