parso - A Python Parser
Parso is a Python parser that supports error recovery and round-trip parsing for different Python versions (in multiple Python versions). Parso is also able to list multiple syntax errors in your python file.
Parso has been battle-tested by jedi. It was pulled out of jedi to be useful for other projects as well.
Parso consists of a small API to parse Python and analyse the syntax tree.
A simple example:
>>> import parso
>>> module = parso.parse('hello + 1', version="3.9")
>>> expr = module.children[0]
>>> expr
PythonNode(arith_expr, [<Name: hello@1,0>, <Operator: +>, <Number: 1>])
>>> print(expr.get_code())
hello + 1
>>> name = expr.children[0]
>>> name
<Name: hello@1,0>
>>> name.end_pos
(1, 5)
>>> expr.end_pos
(1, 9)
To list multiple issues:
>>> grammar = parso.load_grammar()
>>> module = grammar.parse('foo +\nbar\ncontinue')
>>> error1, error2 = grammar.iter_errors(module)
>>> error1.message
'SyntaxError: invalid syntax'
>>> error2.message
"SyntaxError: 'continue' not properly in loop"
Resources
Installation
pip install parso
Future
There will be better support for refactoring and comments. Stay tuned.
There’s a WIP PEP8 validator. It’s however not in a good shape, yet.
Known Issues
async/await are already used as keywords in Python3.6.
from __future__ import print_function is not ignored.
Acknowledgements
Guido van Rossum (@gvanrossum) for creating the parser generator pgen2 (originally used in lib2to3).
Salome Schneider for the extremely awesome parso logo.
Changelog
Unreleased
0.8.7 (2026-05-02)
Add PEP 695 type parameter syntax
0.8.6 (2026-02-09)
Switch the type checker to Zuban. It’s faster and now also checks untyped code.
0.8.5 (2025-08-23)
Add a fallback grammar for Python 3.14+
0.8.4 (2024-04-05)
Add basic support for Python 3.13
0.8.3 (2021-11-30)
Add basic support for Python 3.11 and 3.12
0.8.2 (2021-03-30)
Various small bugfixes
0.8.1 (2020-12-10)
Various small bugfixes
0.8.0 (2020-08-05)
Dropped Support for Python 2.7, 3.4, 3.5
It’s possible to use pathlib.Path objects now in the API
The stubs are gone, we are now using annotations
namedexpr_test nodes are now a proper class called NamedExpr
A lot of smaller refactorings
0.7.1 (2020-07-24)
Fixed a couple of smaller bugs (mostly syntax error detection in Grammar.iter_errors)
This is going to be the last release that supports Python 2.7, 3.4 and 3.5.
0.7.0 (2020-04-13)
Fix a lot of annoying bugs in the diff parser. The fuzzer did not find issues anymore even after running it for more than 24 hours (500k tests).
Small grammar change: suites can now contain newlines even after a newline. This should really not matter if you don’t use error recovery. It allows for nicer error recovery.
0.6.2 (2020-02-27)
Bugfixes
Add Grammar.refactor (might still be subject to change until 0.7.0)
0.6.1 (2020-02-03)
Add parso.normalizer.Issue.end_pos to make it possible to know where an issue ends
0.6.0 (2020-01-26)
Dropped Python 2.6/Python 3.3 support
del_stmt names are now considered as a definition (for name.is_definition())
Bugfixes
0.5.2 (2019-12-15)
Add include_setitem to get_definition/is_definition and get_defined_names (#66)
Fix named expression error listing (#89, #90)
Fix some f-string tokenizer issues (#93)
0.5.1 (2019-07-13)
Fix: Some unicode identifiers were not correctly tokenized
Fix: Line continuations in f-strings are now working
0.5.0 (2019-06-20)
Breaking Change comp_for is now called sync_comp_for for all Python versions to be compatible with the Python 3.8 Grammar
Added .pyi stubs for a lot of the parso API
Small FileIO changes
0.4.0 (2019-04-05)
Python 3.8 support
FileIO support, it’s now possible to use abstract file IO, support is alpha
0.3.4 (2019-02-13)
Fix an f-string tokenizer error
0.3.3 (2019-02-06)
Fix async errors in the diff parser
A fix in iter_errors
This is a very small bugfix release
0.3.2 (2019-01-24)
20+ bugfixes in the diff parser and 3 in the tokenizer
A fuzzer for the diff parser, to give confidence that the diff parser is in a good shape.
Some bugfixes for f-string
0.3.1 (2018-07-09)
Bugfixes in the diff parser and keyword-only arguments
0.3.0 (2018-06-30)
Rewrote the pgen2 parser generator.
0.2.1 (2018-05-21)
A bugfix for the diff parser.
Grammar files can now be loaded from a specific path.
0.2.0 (2018-04-15)
f-strings are now parsed as a part of the normal Python grammar. This makes it way easier to deal with them.
0.1.1 (2017-11-05)
Fixed a few bugs in the caching layer
Added support for Python 3.7
0.1.0 (2017-09-04)
Pulling the library out of Jedi. Some APIs will definitely change.
Metadata
Release files for parso 0.8.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| parso-0.8.7.tar.gz | 401.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| parso-0.8.7-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details |
Total release size: 508.8 kB
Release files / parso-0.8.7.tar.gz
| Download URL | parso-0.8.7.tar.gz |
|---|---|
| Size | 401.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1
|
|
BLAKE2b-256 checksum How to use checksums |
304b90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / parso-0.8.7-py2.py3-none-any.whl
| Download URL | parso-0.8.7-py2.py3-none-any.whl |
|---|---|
| Size | 107.0 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c
|
|
BLAKE2b-256 checksum How to use checksums |
995d8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Security for parso 0.8.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.