`return None` в питоне не рекомендуется.Как обойти? - PullRequest
13 голосов
/ 14 мая 2011

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

Теперь ситуация такова, что моя функция возвращает None. Я вызываю функцию, проверяю, является ли ее возвращаемое значение not None, и продолжаю в коде.

Пример:

def foobar(arg):
    # connect to page by httplib
    # check for arg in a certain pattern by lxml
    if check:
        return result
    else:
        return None

result = foobar(arg)
if result:
    # do stuff
else:
    # do other stuff

Недавно я прочитал, что это не идти . Как мне избежать таких ситуаций?

Ответы [ 4 ]

41 голосов
/ 14 мая 2011

Нет ничего плохого в возврате None.

В большинстве случаев вам не нужно явно возвращать None.Python сделает это за вас.Это измененная версия вашего foobar, которая ведет себя идентично, без явного возврата None:

def foobar(arg):
  if check:
    return result
# If not check, then None will be returned

Тем не менее, даже если Python неявно возвращает None, в явном виде есть значение;Ваш код становится легче читать и понимать.Это постоянный компромисс, на который нет общего ответа.

1 голос
/ 25 июля 2018

Я думаю, что возвращение None - это " без движения " с точки зрения удобства использования, а не стиля. Как кратко упомянуто в этом ответе, рассмотрите возможность создания исключения вместо этого. Например:

def foobar(arg):
    # connect to page by httplib
    # check for arg in a certain pattern by lxml
    if not check:
        raise ValueError("arg did not match pattern in lxml")         
    return result

try:
    result = foobar(arg)
except ValueError:
    result = None

if result is not None:
    # do stuff
else:
    # do other stuff

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

1 голос
/ 14 мая 2011

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

def foobar(arg):
    ...
    if check:
        return result

result = foobar(arg)
if result is not None:
    # do stuff
else:
    # do other stuff
1 голос
/ 14 мая 2011

Это зависит от того, почему это «не ходи»;Я этого не слышал.Если это просто плохая форма, пропустите «return None» (оператор else) вообще, и он вернет None по умолчанию.Если считается неправильным возвращать None, вместо этого верните 0 или '' (пустая строка) или False, в зависимости от типа, ожидаемого вызывающим абонентом.

...