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


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

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

вопрос: это pythonic для функции, возвращающей несколько значений?

5 60

5 ответов:

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.

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

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