Должен ли я вернуть Нет или (Нет, Нет)? - PullRequest
54 голосов
/ 16 августа 2011

У нас есть метод объекта, который возвращает кортеж города / штата, т.е. ('Boston', 'MA').При некоторых действительных обстоятельствах не существует действительного города / штата для возвращения.Стилистически, имеет ли смысл возвращать None или двухэлементный кортеж, содержащий в этом случае (None, None)?

Ответы [ 9 ]

57 голосов
/ 16 августа 2011

Я бы вернул None.Если результата нет, зачем возвращать что-то, что выглядит как результат?

Также проще проверить:

result = getCity()
if result:
   # do something

Я бы только возвратил (None, None)если бы было возможно, чтобы только одно из двух значений было None (то есть ('Boston', None)).Это было бы более последовательным в этом случае.

44 голосов
/ 16 августа 2011

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

city, state = getCityStateTuple("something")

В этом случае возврат None прервет вызывающего абонента с ошибкой:

TypeError: 'NoneType' object is not iterable

Итак, я лично вернул бы (None, None) в вашей ситуации. Опять же, ваш пробег может отличаться, и это зависит от схемы, используемой вашими абонентами.

11 голосов
/ 16 августа 2011

Как уже отмечали другие, кортеж с элементами в нем не проверяется как False, что является одной из причин, по которой вы можете захотеть вернуть None вместо (None, None). Однако можно написать кортеж подкласс , который проверяется как False, даже если в нем есть элементы, переопределяя его метод __nonzero__().

class falsetuple(tuple):
    def __nonzero__(self):
        return False

Тогда вы могли бы вернуть falsetuple((None, None)), когда нет доступных значений. На самом деле, вы всегда можете вернуть тот же falsetuple.

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

11 голосов
/ 16 августа 2011

(None, None) не оценивается как False в Python. Кроме того, для создания кортежа требуется больше работы, чем для создания кортежа. Поэтому я бы предпочел None.

6 голосов
/ 17 августа 2011

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

Если бы это был я, и я выбрал кортеж вместо исключения, я бы использовал FalseTuple, который предлагает kindall, а также понял, что вызывающий код (который использует распаковку кортежа) также может тестировать

if city is None:

чтобы увидеть, был ли получен правильный результат. Таким образом, вы поддерживаете извлечение кортежей по всем возможным возвращаемым значениям, и все же позволяете питоническому идиому спрашивать объект: «Вы оцениваете как True?» (Вот снова добро для полноты):

class FalseTuple(tuple):
    def __nonzero__(self):
        return False
4 голосов
/ 16 августа 2011

почему бы не сделать государство собственностью города? Таким образом, ваша функция всегда будет возвращать одно значение: Город или Нет.

Возврат (Нет, Нет) плох по всем причинам, указанным в других ответах, и служит только для поддержки распаковки кортежей.

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

2 голосов
/ 16 августа 2011

Для меня возвращение (Нет, Нет) будет означать, что (Нет, Штат) или (Город, Нет) также будут действительными возвращаемыми значениями.Если это так, используйте (Нет, Нет), в противном случае Феликс и Брент дают очень хорошие аргументы для простого возврата Нет.

1 голос
/ 16 августа 2011

Если вы вернете None, вам будет намного проще проверить возвращаемое значение.

1 голос
/ 16 августа 2011

Я бы реализовал открытый метод для объекта, который возвратил, скажем, isValidLocation(), который возвращает true, если location допустимо, и false, если location нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...