Почему я не могу использовать return () в условном для управления потоком в Python? - PullRequest
0 голосов
/ 20 мая 2019

Рассмотрим эту функцию:

def parity(num):
    num % 2 == 0 and return "that is even"
    return "that is odd"

Первая строка функции - это синтаксическая ошибка (я использую v 3.7.3).Зачем?Похоже, вы должны быть в состоянии «вернуться» откуда угодно.

ПРИМЕЧАНИЕ. Я понимаю, что в этом конкретном случае я мог бы использовать

return "that is even" if num % 0 == 0 else "that is odd"

Это не моя проблема.Моя проблема в том, что это намного компактнее и легче читать поток, если вы напишите:

condition 1 or return "condition one was not met"
condition 2 or return "condition two was not met"
condition 3 or return "contition three what not met"
[rest of the function goes here]

чем:

   if not condition 1:
        return "condition one was not met"
   if not condition 2:
        return "condition two was not met"
   if not condition 3:
        return "condition three was not met"
   [rest of the function goes here]

и - помимо этого предпочтения краткости /удобочитаемость - для меня просто не имеет смысла, что я не могу просто выполнить возврат в это место в коде. документация для возврата гласит:

7.6.Оператор return

return_stmt ::=  "return" [expression_list]

return может происходить только синтаксически, вложенным в определение функции, но не в определение вложенного класса.

Если присутствует список выражений, он оценивается, иначе None являетсязамещенный.

return оставляет текущий вызов функции со списком выражений (или None) в качестве возвращаемого значения.

Когда return передает управление из оператора try с предложением finally, это предложение finallyвыполняется до фактического выхода из функции.

В функции генератора оператор return указывает на то, что генератор завершен и вызовет StopIteration.Возвращаемое значение (если оно есть) используется в качестве аргумента для создания StopIteration и становится атрибутом StopIteration.value.

В функции асинхронного генератора пустой оператор возврата указывает, что асинхронный генератор выполнен и будет вызывать StopAsyncIterationбыть воспитанным.Непустое выражение return является синтаксической ошибкой в ​​функции асинхронного генератора.

Мне не кажется, что что-то в этом определении исключает использование, которое я пытаюсь использовать.Здесь есть что-то, чего я не понимаю?

Ответы [ 2 ]

7 голосов
/ 20 мая 2019

Здесь проводится различие между «заявлениями» и «выражениями». Выражение A if B else C требует, чтобы выражения A, B и C были выражениями. return - это утверждение, поэтому оно там не работает - так же, как break или raise.

4 голосов
/ 20 мая 2019

Причина правильна в своем названии.Это заявление .Заявления - это разные вещи, чем выражения .Вы можете составить несколько выражений в большее выражение.Не так с заявлениями;определяющей характеристикой оператора является то, что он не может быть частью большего выражения, отчасти потому, что он ведет себя по-разному (обычно управляет потоком), а отчасти потому, что он не приводит к значению , которое может быть составлено вбольшее выражение.

...