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

Можно ли пропустить "return None"?

Интересно, не плохо ли пропустить return None, когда это не нужно.

Пример:

def foo1(x):
    if [some condition]:
        return Baz(x)
    else:
        return None

def foo2(x):
    if [some condition]:
        return Baz(x)

bar1 = foo1(x)
bar2 = foo2(x)

В обоих случаях, когда условие ложно, функция вернется с помощью None.

4b9b3361

Ответ 1

Как вы сказали, return None (почти) никогда не нужен.

Но вы должны учитывать, что намерение вашего кода намного яснее с явным return None. Помните: фрагмент кода также должен быть доступен для чтения людьми, и явное обычно помогает.

Ответ 2

Чтобы изложить то, что сказали другие, я использую return None, если функция должна возвращать значение. В Python все функции возвращают значение, но часто мы записываем функции, которые только когда-либо возвращают None, потому что их возвращаемое значение игнорируется. На некоторых языках их можно было бы назвать процедурами.

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

Если функция "не возвращает" значение, то есть, если она никогда не вызывается кем-то с использованием ее возвращаемого значения, тогда она заканчивается без возврата, и если мне нужно вернуться раньше, я использую голая форма, return.

Ответ 3

Да и Нет.

В простейшем случае нормально пропускать "return None", потому что он возвращает None только в одном отрицательном состоянии.

Но если есть оценка вложенных условий и несколько сценариев, в которых функция может вернуть None. Я склонен включать их в качестве визуальной документации сценариев.

[Редактирование: на основе комментария ниже]

вернуть или вернуть None

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

Ответ 4

Да, если вы не возвращаете значение из функции Python, оно возвращает None. Итак, нужно ли явно возвращать None, это стилистическое решение.

Лично я предпочитаю всегда возвращать значение для ясности.

Ответ 5

def foo1(x):
    try:
        return Baz(x)
    except:
        raise ValueError('Incorrect value fo Bac')

или

def foo3(x):
    return Baz(x) if <condition> else False

Я не верю в половину определенной функции, но это False может быть полезно при обрезке отказа типа поиска.

Ответ 6

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

b = foo1(123)
if b is not None:
    ...

Вы даже не могли написать:

if b:
    ...

поскольку, если Baz.__nonzero__ перезаписывается, b может оценивать значение False, даже если оно не является None. Было бы лучше иметь экземпляр Null-Baz (AKA Null Object), например:

class Baz(object):
    def some_method(self):
        """some action:"""
        ...
    ...

class BazNull(Baz):
    def some_method(self):
        """nothing happens here"""
    ...

Baz.Null = BazNull()

...

def foo1(x):
    if some_condition:
        return Baz(x)
    else:
        return Baz.Null

...

b = foo1(123)
b.some_method()

Дело в следующем: помогите клиенту (кто может быть самим!), чтобы поддерживать Cyclomatic Complexity низким. Чем меньше ветвей, тем лучше.