diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2019-09-09 20:36:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-09 20:36:13 (GMT) |
commit | 832e8640086ac4fa547c055a72929879cc5a963a (patch) | |
tree | a53bf8e8b0b8982eb1c1fbe6b858a426f3284c24 | |
parent | b9f65f01fd761da7799f36d29b54518399d3458e (diff) | |
download | cpython-832e8640086ac4fa547c055a72929879cc5a963a.zip cpython-832e8640086ac4fa547c055a72929879cc5a963a.tar.gz cpython-832e8640086ac4fa547c055a72929879cc5a963a.tar.bz2 |
bpo-38049: Add command-line interface for the ast module. (GH-15724)
-rw-r--r-- | Doc/library/ast.rst | 36 | ||||
-rw-r--r-- | Lib/ast.py | 24 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2019-09-07-12-32-50.bpo-38049.xKP4tf.rst | 1 |
3 files changed, 61 insertions, 0 deletions
diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index cb8e7ec..b468f42 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -340,6 +340,42 @@ and classes for traversing abstract syntax trees: Added the *indent* option. +.. _ast-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 3.9 + +The :mod:`ast` module can be executed as a script from the command line. +It is as simple as: + +.. code-block:: sh + + python -m ast [-m <mode>] [-a] [infile] + +The following options are accepted: + +.. program:: ast + +.. cmdoption:: -h, --help + + Show the help message and exit. + +.. cmdoption:: -m <mode> + --mode <mode> + + Specify what kind of code must be compiled, like the *mode* argument + in :func:`parse`. + +.. cmdoption:: -a, --include-attributes + + Include attributes such as line numbers and column offsets. + +If :file:`infile` is specified its contents are parsed to AST and dumped +to stdout. Otherwise, the content is read from stdin. + + .. seealso:: `Green Tree Snakes <https://greentreesnakes.readthedocs.io/>`_, an external documentation resource, has good @@ -550,3 +550,27 @@ _const_node_type_names = { bytes: 'Bytes', type(...): 'Ellipsis', } + + +def main(): + import argparse + + parser = argparse.ArgumentParser(prog='python -m ast') + parser.add_argument('infile', type=argparse.FileType(mode='rb'), nargs='?', + default='-', + help='the file to parse; defaults to stdin') + parser.add_argument('-m', '--mode', default='exec', + choices=('exec', 'single', 'eval', 'func_type'), + help='specify what kind of code must be parsed') + parser.add_argument('-a', '--include-attributes', action='store_true', + help='include attributes such as line numbers and ' + 'column offsets') + args = parser.parse_args() + + with args.infile as infile: + source = infile.read() + tree = parse(source, args.infile.name, args.mode, type_comments=True) + print(dump(tree, include_attributes=args.include_attributes, indent=3)) + +if __name__ == '__main__': + main() diff --git a/Misc/NEWS.d/next/Library/2019-09-07-12-32-50.bpo-38049.xKP4tf.rst b/Misc/NEWS.d/next/Library/2019-09-07-12-32-50.bpo-38049.xKP4tf.rst new file mode 100644 index 0000000..9f17683 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-07-12-32-50.bpo-38049.xKP4tf.rst @@ -0,0 +1 @@ +Added command-line interface for the :mod:`ast` module. |