From: Serhiy Storchaka Date: Mon, 9 Sep 2019 20:36:13 +0000 (+0300) Subject: bpo-38049: Add command-line interface for the ast module. (GH-15724) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=832e8640086ac4fa547c055a72929879cc5a963a;p=python bpo-38049: Add command-line interface for the ast module. (GH-15724) --- diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index cb8e7ec829..b468f4235d 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 ] [-a] [infile] + +The following options are accepted: + +.. program:: ast + +.. cmdoption:: -h, --help + + Show the help message and exit. + +.. cmdoption:: -m + --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 `_, an external documentation resource, has good diff --git a/Lib/ast.py b/Lib/ast.py index 498484f198..720dd48a76 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -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 0000000000..9f17683032 --- /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.