Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Python Parser

Shantanu edited this page Sep 12, 2023 · 8 revisions

The mypy parser uses the CPython "ast" module to convert source code into an abstract syntax tree (AST). The mypy parser then translates the CPython AST into a mypy AST defined in mypy/nodes.py. (The term parse tree is sometimes used informally as a synonym of AST.)

We don't use the CPython AST directly since it doesn't contain all the node types and attributes mypy needs. Having a custom AST implementation also gives us more flexibility and is more efficient.

You can manually call the mypy.parse.parse function to experiment with it (first install test dependencies in the current virtualenv):

$ cd mypy  # mypy repo
$ python
>>> from mypy.options import Options
>>> from mypy.parse import parse
>>> print(parse("print('hello, world')", "hello.py", None, None, Options()))
MypyFile:1(
  hello.py
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(print)
      Args(
        StrExpr(hello, world)))))

The names MypyFile, ExpressionStmt, CallExpr, NameExpr and StrExpr refer to AST node classes defined in mypy/nodes.py. The numbers after colons are line numbers.

The parser does only a minimal amount of consistency checks. As such it also accepts many invalid programs. The next compiler pass, Semantic Analyzer, performs additional checks.

Clone this wiki locally

Morty Proxy This is a proxified and sanitized view of the page, visit original site.