Search code examples
pythonimportterminalsyntax-error

For loop after import doesn't work in Python one-liner


If I use import and a for follows afterwards I get an invalid syntax error. I have no idea why this happens.

> python3 -c 'import os; for a in range(1,5): print(a)'
  File "<string>", line 1
    import os; for a in range(1,5): print(a)
                 ^

Removing the import works fine:

> python3 -c 'for a in range(1,5): print(a)'
1
2
3
4

or totally removing the for loop:

> python3 -c 'import os; print(10)'
10

So what's going on??


Solution

  • It's an error because it's not in the Python grammar.

    If you check out the syntax specification for compound statements, you'll see that a statement list (i.e. what you're making with the semicolon) is defined as:

    stmt_list ::= simple_stmt (";" simple_stmt)* [";"]

    and the for construct is not a simple_stmt, but instead is a compound_stmt.

    The print(10), however, is a simple_stmt and, as such, is just fine.