Skip to main content

cross-version compatible ast library

Project description

License versions pypi

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 field posonlyarg is introduced, hence you should construct an ast.arguments with an additional argument posonlyarg=... 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 of ast.XXX to construct ASTs.

  • Support ast.Constant before Python 3.6.

    ast.Constant is convenient, and things like ast.Num are redundant according to this observation and improvement: https://bugs.python.org/issue32892

    However, ast.Constant is not available in 3.5 or earlier versions, thus we backport ast.Constant in this library.

    To access the content of ast.Constant in a compatible way, use ast_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

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

ast_compat-0.12.0-py3-none-any.whl (53.1 kB view details)

Uploaded Python 3

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

Hashes for ast_compat-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 911d81236a18201d4930c93ccd6a2d3dd14442cbccfbd2787b883ac8cb38b208
MD5 053c3a27dfa12dcf80f124c6e6f2a321
BLAKE2b-256 d5d006e348161072f45b610d80427196ee249a030783179f5d65473983c15b76

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page