У нас есть метод объекта, который возвращает кортеж city/state, т.е. ('Boston', 'MA')
. В некоторых действительных обстоятельствах нет действительного города/государства для возвращения. Стилистически, имеет ли смысл возвращать None
или двухэлементный кортеж, содержащий (None, None)
в этом случае?
Должен ли я вернуть None или (None, None)?
Ответ 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, вам будет намного легче проверить возвращаемое значение.