summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-09-09 20:36:13 (GMT)
committerGitHub <noreply@github.com>2019-09-09 20:36:13 (GMT)
commit832e8640086ac4fa547c055a72929879cc5a963a (patch)
treea53bf8e8b0b8982eb1c1fbe6b858a426f3284c24
parentb9f65f01fd761da7799f36d29b54518399d3458e (diff)
downloadcpython-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.rst36
-rw-r--r--Lib/ast.py24
-rw-r--r--Misc/NEWS.d/next/Library/2019-09-07-12-32-50.bpo-38049.xKP4tf.rst1
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
diff --git a/Lib/ast.py b/Lib/ast.py
index 498484f..720dd48 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 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.