`return None` в python не рекомендуется. Как обойти?

У меня есть функция, которая соединяется с 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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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