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

В 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)
4b9b3361

Ответ 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 выполняет какой-то контракт для функции, предоставляя явный результат.