В Python, в чем разница между pass и return
Я видел некоторый код в Pinax и других приложениях django, которые вместо прохода используют пустой оператор return. В чем разница и повлияет ли это на, например, код django ниже, который я запускаю? Код - это метод сигнала, который автоматически сохраняет хэштеги в тег taggit для объекта tweet.
Я видел здесь вопрос о том, имеет ли наличие или нет оператор return в PHP, имеет значение в интерпретируемом байт-коде, но я не уверен, имеет ли он отношение к Python.
import re
TAG_REGEX = re.compile(r'#(?P<tag>\w+)')
def get_tagged(sender, instance, **kwargs):
"""
Automatically add tags to a tweet object.
"""
if not instance:
return # will pass be better or worse here?
post = instance
tags_list = [smart_unicode(t).lower() for t in list(set(TAG_REGEX.findall(post.content)))]
if tags_list:
post.tags.add(*tags_list)
post.save()
else:
return # will a pass be better or worse here?
post_save.connect(get_tagged, sender=Tweet)
Ответы
Ответ 1
if not instance:
return # will pass be better or worse here?
Хуже. Это изменяет логику. pass
на самом деле означает: ничего не делать. Если вы замените return
на pass
здесь, поток управления будет продолжаться, изменив семантику кода.
Целью pass
является создание пустых блоков, что в противном случае невозможно с помощью схемы отступа Python. Например, пустая функция в C выглядит так:
void foo()
{
}
В Python это будет синтаксическая ошибка:
def foo():
Здесь pass
подходит:
def foo():
pass
Ответ 2
Return выходит из текущей функции или метода. Pass - это нулевая операция и позволяет выполнение продолжить в следующем выражении.
Ответ 3
Это иллюстрирует некоторые более ранние ответы.
def p():
"Executes both blocks."
if 1:
print(1)
pass
if 1:
print(2)
pass
def r():
"Executes only the first block."
if 1:
print(1)
return
if 1:
print(2)
return
Ответ 4
if not instance:
return # will pass be better or worse here?
a pass
продолжит выполнение метода. A return
прекратит выполнение метода. Что касается следующих строк, вы хотите разместить здесь return
.
else:
return # will a pass be better or worse here?
здесь это не повлияет. Даже удаление всех двух строк ничего не изменит.
Но, во всяком случае, представьте, что вы продолжите разработку метода. Лучше выбрать правильный поток с самого начала.
Ответ 5
Это скорее комментарий, чем ответ, но он не подходит в качестве комментария.
if not instance:
return # will pass be better or worse here?
Как объяснено в принятом ответе, pass
будет неправильным.
else:
return # will a pass be better or worse here?
Здесь, поскольку мы находимся в конце функции, pass
будет делать то же самое: ничего. Еще лучше было бы полностью отказаться от предложения else
, так как делать нечего. (Это правда, что "явный лучше, чем неявный" в Zen, но это редко применяется к явно не делая ничего - ясно, что происходит в случае else
, всем, кто на самом деле даже задается вопросом об этом в первую очередь.)
(Также непонятно, почему вы переименовали instance
в post
внутри функции - вы могли просто изменить имя параметра? - или то, что должен быть аргумент sender
. О, и вы не знаете, t действительно нужно преобразовать a set
в list
, чтобы перебирать его в понимании списка.:))
Ответ 6
Смотрите документы python на pass и return. В вашем текущем коде нет никакой разницы (на самом деле, я бы полностью оставил else
).
Разница заключается главным образом в семантике: pass
может использоваться там, где инструкция синтаксически требуется, но не требуется (пока). С другой стороны, return
выполняет какой-то контракт для функции, предоставляя явный результат.