Ответ 1
Как вы сказали, return None
(почти) никогда не нужен.
Но вы должны учитывать, что намерение вашего кода намного яснее с явным 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
.
Как вы сказали, return None
(почти) никогда не нужен.
Но вы должны учитывать, что намерение вашего кода намного яснее с явным return None
. Помните: фрагмент кода также должен быть доступен для чтения людьми, и явное обычно помогает.
Чтобы изложить то, что сказали другие, я использую return None
, если функция должна возвращать значение. В Python все функции возвращают значение, но часто мы записываем функции, которые только когда-либо возвращают None, потому что их возвращаемое значение игнорируется. На некоторых языках их можно было бы назвать процедурами.
Итак, если функция должна возвращать значение, то я убеждаюсь, что все пути кода имеют возврат, и что возврат имеет значение, даже если оно равно None.
Если функция "не возвращает" значение, то есть, если она никогда не вызывается кем-то с использованием ее возвращаемого значения, тогда она заканчивается без возврата, и если мне нужно вернуться раньше, я использую голая форма, return
.
Да и Нет.
В простейшем случае нормально пропускать "return None", потому что он возвращает None только в одном отрицательном состоянии.
Но если есть оценка вложенных условий и несколько сценариев, в которых функция может вернуть None. Я склонен включать их в качестве визуальной документации сценариев.
[Редактирование: на основе комментария ниже]
вернуть или вернуть None
Я предпочитаю "возвращать None", чтобы обнажить "return" , поскольку он явный, и позже никто не будет сомневаться в том, что возврат означает возвращение None или это была ошибка, поскольку что-то не хватало.
Да, если вы не возвращаете значение из функции Python, оно возвращает None. Итак, нужно ли явно возвращать None, это стилистическое решение.
Лично я предпочитаю всегда возвращать значение для ясности.
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 может быть полезно при обрезке отказа типа поиска.
Чем больше я думаю об этом, тем меньше я думаю, что случай, который вы описываете, показывает хорошую практику. Это заставляет клиента различать, поэтому клиентский код почти всегда выглядит следующим образом:
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 низким. Чем меньше ветвей, тем лучше.