Можно ли пропустить «вернуть нет»? - PullRequest
39 голосов
/ 27 октября 2010

Интересно, если это неправильный способ пропустить 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.

Ответы [ 7 ]

57 голосов
/ 27 октября 2010

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

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

25 голосов
/ 27 октября 2010

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

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

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

5 голосов
/ 27 октября 2010

Да и нет.

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

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

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

возврат или возврат Нет

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

3 голосов
/ 27 октября 2010

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

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

0 голосов
/ 11 февраля 2019

Я не согласен со многими ответами здесь.
Явное лучше, чем неявное, но иногда меньше, когда речь идет о читабельности.

def get_cat():
    if cat_is_alive():
        return Cat()
# vs     

def get_cat():
    if cat_is_alive():
        return Cat()
    return None

В этом конкретном примере у вас есть 2 дополнительные строки, которые действительно не дают полезной информации, так как все функции по умолчанию возвращают None.

Кроме того, явная return None исчезает еще больше с использованиемподсказок типа:

def get_cat() -> Union[Cat, None]:
    if cat_is_alive():
        return Cat()

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

Имхо, избегайте отставания return None они абсолютно бессмысленны и безобразны.

0 голосов
/ 27 октября 2010

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

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()

Суть в том, чтобы помочь клиенту (который может быть вами!) Сохранить Цикломатическая сложность низкая.Чем меньше веток, тем лучше.

0 голосов
/ 27 октября 2010
def foo1(x):
    try:
        return Baz(x)
    except:
        raise ValueError('Incorrect value fo Bac')

или

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

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

...