Подтвердить что ты не робот

Должен ли я вернуть None или (None, None)?

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

4b9b3361

Ответ 1

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

Также легче проверить:

result = getCity()
if result:
   # do something

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

Ответ 2

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

city, state = getCityStateTuple("something")

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

TypeError: 'NoneType' object is not iterable

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

Ответ 3

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

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

Затем вы можете вернуть falsetuple((None, None)), когда нет доступного значения. Фактически, вы всегда можете вернуть тот же falsetuple.

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

Ответ 4

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

Ответ 5

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

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

if city is None:

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

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

Ответ 6

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

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

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

Ответ 7

Для меня возвращение (None, None) подразумевает, что (None, State) или (City, None) также будут действительными возвращаемыми значениями. Если это так, пойдите с (None, None), в противном случае Felix и Brent предоставят очень хорошие аргументы для простого возврата None.

Ответ 8

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

Ответ 9

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