Python для однострочного цикла, вызванного из командной строки bash, дает неверный синтаксис, но понимание списка работает нормально

я не знаю почему

$ echo -e "test1\ntest2\ntest3" | python -c "import sys; for i in sys.stdin: print(i)"

дает неверный синтаксис:

      File "<string>", line 1
    import sys; for i in sys.stdin: print(i)
                ^^^
SyntaxError: invalid syntax

он отлично работает при использовании понимания списка:

$ echo -e "test1\ntest2\ntest3" | python -c "import sys; [print(i) for i in sys.stdin]"

приводит к:

   test1

   test2

   test3

Вы можете заставить это работать, если поместите разрывы строк и отступы в: echo -e "test1\ntest2\ntest3" | python -c $'import sys\nfor i in sys.stdin:\n\tprint(i)'

slothrop 03.04.2023 19:56

Тем не менее, echo -e — это в первую очередь плохая форма. printf '%s\n' test1 test2 test3 гораздо лучше - или printf '%b\n' 'test1\ntest2\ntest3', если нельзя изменить строку для форматирования/печати. См. unix.stackexchange.com/questions/65803/…

Charles Duffy 03.04.2023 19:57

@slothrop спасибо, мне было интересно, какой альтернативный разделитель ';' было бы в этом случае. '\n' поначалу кажется немного трудным для чтения, но, возможно, это вопрос привыкания.

Daniel Krajnik 03.04.2023 20:33

@CharlesDuffy спасибо, что указали на это, раньше я понятия не имел об этой проблеме.

Daniel Krajnik 03.04.2023 20:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оператор в Python — это либо один составной оператор, либо один или несколько простых операторов, разделенных ;s. Составные операторы — это те, которые состоят из строки, заканчивающейся :, за которой следует один или несколько дополнительных операторов. Вы не можете соединить их с помощью ;, потому что было бы неоднозначно, была ли точка с запятой частью вложенного блока или завершала составной оператор.

Из https://docs.python.org/3/reference/grammar.html

statement: compound_stmt  | simple_stmts 

simple_stmts:
    | simple_stmt !';' NEWLINE  # Not needed, there for speedup
    | ';'.simple_stmt+ [';'] NEWLINE 

simple_stmt:
    | assignment
    | star_expressions 
    | return_stmt
    | import_stmt
    | raise_stmt
    | 'pass' 
    | del_stmt
    | yield_stmt
    | assert_stmt
    | 'break' 
    | 'continue' 
    | global_stmt
    | nonlocal_stmt

compound_stmt:
    | function_def
    | if_stmt
    | class_def
    | with_stmt
    | for_stmt
    | try_stmt
    | while_stmt
    | match_stmt

это объясняет это, спасибо и спасибо за ссылку на грамматику python

Daniel Krajnik 03.04.2023 20:37

Другие вопросы по теме