Почему несколько составных операторов в Python не могут быть в одной строке? - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу максимально сжать свой код.Почему в Python не допускается следующее?

string = input()
if string.isnumeric: pass
else: if string == 'tesr': print('test') else: print('stop')

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

На самом деле, вы можете иметь несколько операторов if в одной строке. Например твой код

string = input()
if string.isnumeric: pass
else: if string == 'tesr': print('test') else: print('stop')

Можно записать как один лайнер.

if not string.isnumeric(): print('test') if (string == 'tesr') else print('stop')

или, если вы предпочитаете

None if string.isnumeric() else print('test') if (string == 'tesr') else print('stop')

Однако я согласен с @timgeb в комментариях - важна читабельность!

EDIT

После того, как вы изменили свой вопрос с «Почему я не могу написать следующий код в виде одной строки» на «Я хочу максимально сжать свой код. Почему в Python не разрешено следующее?» ... Хорошо, потому что отступы важны для python, так что, как вы думаете, будет делать следующий код:

if x == 1: print(1) if x == 3: print(2) else: print(3)

? Можно подумать, что этот код либо представляет

if x == 1: print(1)
if x == 3: print(2)
else: print(3)

или

if x == 1:
    print(1)
    if x == 3: print(2)
else: print(3)

Так что вы ожидаете? Это был бы хаос, потому что никто больше не знал бы, как что-то анализируется.

0 голосов
/ 13 ноября 2018

В грамматике вы ищете

if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE

(я переставил их).Таким образом, оператор if имеет suite, то есть часть, которая выполняется, если test верен.suite - это либо один простой оператор, либо блок с простыми операторами с отступом.

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

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

0 голосов
/ 13 ноября 2018

В данном конкретном случае проблема заключается в том, что Python использует отступ для определения включения блока.Посмотрите на проблему "висящий еще".Некоторые языки используют фигурные скобки или другие «видимые» знаки препинания;Python использует пробел в начале новой строки.Без этих новых строк у вас нет легального if во всех случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...