cross-version compatible ast library
Project description
AST-Compat
Compatible AST construction and ast.unparse
for Python 3.5-3.13.
What is AST-Compat for?
-
backward compatibility for constructing ASTs
For instance,
ast.arguments
is changed since Python 3.8, that another fieldposonlyarg
is introduced, hence you should construct anast.arguments
with an additional argumentposonlyarg=...
since Python 3.8 and it wouldn't work if your code is written before Python 3.8.Through
ast_compat
, you don't have to worry about above question if a new argument is optional or a list.Note that you should use
ast_compat.XXX
instead ofast.XXX
to construct ASTs. -
Support ast.Constant before Python 3.6.
ast.Constant
is convenient, and things likeast.Num
are redundant according to this observation and improvement: https://bugs.python.org/issue32892However,
ast.Constant
is not available in 3.5 or earlier versions, thus we backportast.Constant
in this library.To access the content of
ast.Constant
in a compatible way, useast_compat.get_constant
instead of.value
. -
Support dumping AST to string with ast_compat.unparse, which synchronizes the tooling code provided by CPython official repo.
Usage
import ast_compat as astc
from ast_compat import get_constant
assert get_constant(astc.Constant((1, 2))) == (1, 2)
empty_args = astc.arguments() # work for all of Python 3.5-3.13
Implementation, and rebuild
The compatibility is following the specification of Python ASTs, i.e, the ADSL file you can find at
https://github.com/python/cpython/blob/<branch/tag>/Parser/Python.asdl
.
We parse the file, and generate verifications and default argument factories,
check ast_compat/compat3k*_{ast|unparse}.py
. To explain, ast_compat/compat3k5_*.py
is for
Python 3.5, and ast_compat/compat3k9_*.py
is for Python 3.9.
The file of generator is generate_ast_compat.py
, and the use of generator API is in this way:
from generate_ast_compat import compat
compat((3, 5)) # generate ast_compat/compat3k5_ast.py and ast_compat/compat3k5_unparse.py
compat((3, 6))
compat((3, 7))
compat((3, 8))
prerelease_url = "https://raw.githubusercontent.com/python/cpython/v3.9.0a3/parser/python.asdl"
compat((3, 9), prerelease_url)
The code generation needs Python 3.7+, though this library works for Python 3.5 and 3.5+.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file ast_compat-0.12.0-py3-none-any.whl
.
File metadata
- Download URL: ast_compat-0.12.0-py3-none-any.whl
- Upload date:
- Size: 53.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 911d81236a18201d4930c93ccd6a2d3dd14442cbccfbd2787b883ac8cb38b208 |
|
MD5 | 053c3a27dfa12dcf80f124c6e6f2a321 |
|
BLAKE2b-256 | d5d006e348161072f45b610d80427196ee249a030783179f5d65473983c15b76 |