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

tl; dr: «PECS» находится с точки зрения коллекции. Если вы только вытаскиваете предметы из общей коллекции, это производитель, и вы должны использовать extends; если вы загружаете только элементы, это потребитель, и вы должны использовать super. Если вы делаете оба с одной и той же коллекцией, вы не должны использовать либо extends, либо super.


Предположим, что у вас есть метод, который принимает в качестве параметра набор вещей, но вы хотите, чтобы он был более гибким, чем просто принятие Collection<Thing>.

Случай 1: вы хотите пройти коллекцию и делать вещи с каждым элементом. Затем список будет производителем, поэтому вы должны использовать Collection<? extends Thing>.

. Поводом является то, что Collection<? extends Thing> может содержать любой подтип Thing, и поэтому каждый элемент будет вести себя как Thing ] при выполнении операции. (Фактически вы не можете добавить что-либо к Collection<? extends Thing>, потому что во время выполнения вы не можете знать, какой подтип [] Thing содержится в коллекции.)

Случай 2: вы хотите добавьте вещи в коллекцию. Затем список - это потребитель, поэтому вы должны использовать Collection<? super Thing>.

. Здесь рассуждение состоит в том, что в отличие от Collection<? extends Thing>, Collection<? super Thing> всегда может удерживать Thing независимо от того, какой фактический параметризованный тип является. Здесь вам все равно, что уже есть в списке, если он позволит добавить Thing; это то, что гарантирует ? super Thing.

66
задан Community 23 May 2017 в 12:17
поделиться

5 ответов

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

succeeded, b = f("a") # Automatic tuple unpacking
127
ответ дан Svend 24 November 2019 в 14:50
поделиться

Возвратите кортеж.

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

success, modified_string = f(something)
16
ответ дан rmmh 24 November 2019 в 14:50
поделиться

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

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

29
ответ дан Jason Baker 24 November 2019 в 14:50
поделиться

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

7
ответ дан Chris Upchurch 24 November 2019 в 14:50
поделиться

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

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

3
ответ дан tuxedo 24 November 2019 в 14:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: