Fix: Python SyntaxError: invalid syntax
Quick Answer
How to fix Python SyntaxError invalid syntax caused by missing colons, parentheses, wrong operators, Python 2 vs 3 syntax, f-strings, and walrus operator issues.
The Error
You run a Python script and get:
File "app.py", line 5
if x == 10
^
SyntaxError: invalid syntaxOr variations:
SyntaxError: invalid syntax (line 12)SyntaxError: invalid syntax. Perhaps you forgot a comma?SyntaxError: f-string: expecting '}'Python’s parser could not understand your code. The ^ caret points to approximately where the parser gave up, but the actual mistake is often on the line before or a few characters earlier.
Why This Happens
Python’s parser reads your code token by token. When it encounters something unexpected — a missing colon, an unmatched parenthesis, a keyword used as a variable name — it stops and reports SyntaxError.
The error location is where the parser gave up, not necessarily where the mistake is. A missing closing parenthesis on line 5 might cause a SyntaxError on line 10 where the parser finally realizes something is wrong.
Common causes:
- Missing colon after
if,for,while,def,class,else,elif,try,except,with. - Unmatched parentheses, brackets, or quotes.
- Using
=instead of==in conditions. - Python 2 syntax in Python 3.
print "hello"instead ofprint("hello"). - Missing commas in lists, dicts, or function arguments.
- Using reserved keywords as variable names.
- Invalid f-string expressions.
Fix 1: Add the Missing Colon
The most common cause. Control structures require a colon at the end:
Broken:
if x > 10
print("big")
for i in range(5)
print(i)
def greet(name)
return f"Hello, {name}"
class User
passFixed:
if x > 10:
print("big")
for i in range(5):
print(i)
def greet(name):
return f"Hello, {name}"
class User:
passEvery if, elif, else, for, while, def, class, try, except, finally, and with statement must end with :.
Fix 2: Fix Unmatched Parentheses and Brackets
An unclosed (, [, or { causes a SyntaxError, often on a later line:
Broken:
data = {
"name": "Alice",
"age": 30
# Missing closing }
print("done") # SyntaxError appears HERE, not on the dictFixed:
data = {
"name": "Alice",
"age": 30
}
print("done")Tip: Count your brackets. Most editors highlight matching brackets. If the error points to a line that looks correct, check previous lines for unclosed brackets.
Common case — multi-line function call:
result = some_function(
arg1,
arg2,
arg3
# Missing )
next_line = "hello" # Error appears herePro Tip: When the SyntaxError points to a line that looks perfectly valid, the bug is almost always on a previous line — usually an unclosed parenthesis, bracket, or string. Start from the error line and scan backwards.
Fix 3: Fix Python 2 vs Python 3 Syntax
If you are running Python 3 with Python 2 code:
print statement (Python 2) → print function (Python 3):
# Python 2 (SyntaxError in Python 3):
print "Hello"
# Python 3:
print("Hello")Integer division:
# Python 2: 5 / 2 = 2 (integer division)
# Python 3: 5 / 2 = 2.5 (float division)
# Python 3: 5 // 2 = 2 (integer division)except syntax:
# Python 2 (SyntaxError in Python 3):
except ValueError, e:
# Python 3:
except ValueError as e:raise syntax:
# Python 2:
raise ValueError, "message"
# Python 3:
raise ValueError("message")Check your Python version: python --version. If Python itself is not found, see Fix: python command not found.
Fix 4: Fix Assignment vs Comparison
Using = (assignment) where == (comparison) is expected:
Broken:
if x = 10: # SyntaxError — cannot assign in if condition
print("ten")Fixed:
if x == 10:
print("ten")Walrus operator (Python 3.8+):
If you intentionally want to assign AND compare:
if (n := len(items)) > 10:
print(f"Too many items: {n}")The walrus operator := is valid in Python 3.8+. In older versions, it causes a SyntaxError.
Fix 5: Fix F-String Syntax Errors
F-strings have special parsing rules:
Broken — backslash inside f-string expression (before Python 3.12):
name = f"{'\\n'.join(items)}" # SyntaxError in Python < 3.12Fixed — use a variable:
newline = "\n"
name = f"{newline.join(items)}"Broken — unmatched braces:
msg = f"Value is {x" # Missing closing }
msg = f"Use {{x}}" # Wrong — {{ is an escaped braceFixed:
msg = f"Value is {x}"
msg = f"Use {{{x}}}" # Literal { + value + literal }Broken — nested quotes:
msg = f"Hello {"world"}" # SyntaxError in Python < 3.12Fixed:
msg = f"Hello {'world'}" # Use different quotes inside
# Or in Python 3.12+:
msg = f"Hello {"world"}" # Now validFix 6: Fix Reserved Keyword Usage
Using Python keywords as variable or function names:
class = "Math" # SyntaxError — 'class' is reserved
return = 42 # SyntaxError — 'return' is reserved
import = "data.csv" # SyntaxError — 'import' is reservedPython reserved keywords:
False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
Fix — use a different name:
class_name = "Math"
return_value = 42
import_path = "data.csv"Common Mistake: Using
type,list,dict,str,int,id,input,formatas variable names. These are not keywords (no SyntaxError), but they shadow built-in functions, causing subtle bugs later. For example,list = [1,2,3]means you can no longer calllist().
Fix 7: Fix Missing Commas
Missing commas in collections, function calls, or multi-line expressions:
Broken — missing comma in list:
items = [
"apple"
"banana" # SyntaxError or silent string concatenation!
"cherry"
]Python concatenates adjacent string literals: "apple" "banana" becomes "applebanana". This is not a SyntaxError but is almost certainly a bug.
Fixed:
items = [
"apple",
"banana",
"cherry",
]Broken — missing comma in function call:
result = my_function(
arg1
arg2 # SyntaxError
)Fixed:
result = my_function(
arg1,
arg2,
)Trailing commas are valid in Python and recommended for multi-line structures — they make diffs cleaner.
Fix 8: Fix Multi-Line String Issues
Broken — unclosed string:
message = "Hello
World" # SyntaxError — string not closedFixed — use triple quotes for multi-line:
message = """Hello
World"""Or use explicit newline:
message = "Hello\nWorld"Or parenthesized string concatenation:
message = (
"Hello "
"World"
)For indentation-related syntax issues, see Fix: Python IndentationError.
Still Not Working?
If you cannot find the syntax error:
Use Python’s -c flag to test snippets:
python3 -c "if True: print('ok')"Use a linter. pylint, flake8, or ruff catch syntax errors with better messages:
pip install ruff
ruff check app.pyCheck for invisible characters. Copy-pasting from web pages can introduce zero-width spaces or non-breaking spaces:
import re
with open("app.py", "rb") as f:
content = f.read()
non_ascii = [(i, b) for i, b in enumerate(content) if b > 127]
print(non_ascii)Check for mixed tabs and spaces. Python 3 does not allow mixing tabs and spaces for indentation. Configure your editor to use spaces only:
python3 -tt app.py # Warns about tab/space mixingCheck the encoding declaration. Non-UTF-8 files might need an encoding header:
# -*- coding: utf-8 -*-If the error is about imports rather than syntax, see Fix: Python ModuleNotFoundError. If the file has correct syntax but wrong indentation, see Fix: Python IndentationError.
For ValueError during type conversions (not syntax errors), see Fix: Python ValueError: invalid literal for int().
Solo developer based in Japan. Every solution is cross-referenced with official documentation and tested before publishing.
Was this article helpful?
Related Articles
Fix: AWS Lambda Unable to import module / Runtime.ImportModuleError
How to fix the AWS Lambda Runtime.ImportModuleError and Unable to import module error caused by wrong handler paths, missing dependencies, layer issues, and packaging problems.
Fix: Python TypeError: unhashable type: 'list'
Learn why Python raises TypeError unhashable type list, dict, or set and how to fix it when using dictionary keys, sets, groupby, dataclasses, and custom classes.
Fix: Django Forbidden (403) CSRF verification failed
How to fix Django 403 CSRF verification failed error caused by missing CSRF tokens, AJAX requests, cross-origin issues, HTTPS misconfig, and session problems.
Fix: FastAPI 422 Unprocessable Entity (validation error)
How to fix FastAPI 422 Unprocessable Entity error caused by wrong request body format, missing fields, type mismatches, query parameter errors, and Pydantic validation.