Skip to content

Typing the ast.AST subclass constructors #8378

Closed
@multimeric

Description

@multimeric

We currently have static types for the fields of most (all?) ast classes, but none of these have typed constructors, e.g.:

typeshed/stdlib/_ast.pyi

Lines 79 to 86 in 62cde01

class ClassDef(stmt):
if sys.version_info >= (3, 10):
__match_args__ = ("name", "bases", "keywords", "body", "decorator_list")
name: _Identifier
bases: list[expr]
keywords: list[keyword]
body: list[stmt]
decorator_list: list[expr]

I think technically this might be because none of these subclasses actually have a unique constructor, but that shouldn't stop us from typing each of the constructors, since in practise the constructor arguments must correspond to the class fields.

Before I do this, though, I'm firstly wondering if an easy solution here would be to apply the dataclass_transform decorator (note: not the same as the dataclass decorator). This would simply tell the type checker that all the class fields can and should be provided in the constructor, which is broadly correct. However I don't have a deep understanding of how the ast.AST constructor works, so this might not be the correct behaviour. For ClassDef this might look like:

from typing_extensions import dataclass_transform

@dataclass_transform
class ClassDef(stmt): 
    if sys.version_info >= (3, 10): 
        __match_args__ = ("name", "bases", "keywords", "body", "decorator_list") 
    name: _Identifier 
    bases: list[expr] 
    keywords: list[keyword] 
    body: list[stmt] 
    decorator_list: list[expr] 

If this isn't sufficient, I propose that we simply add an __init__() stub to each subclass. For instance, for the ClassDef above, this might look like:

class ClassDef(stmt): 
    if sys.version_info >= (3, 10): 
        __match_args__ = ("name", "bases", "keywords", "body", "decorator_list") 
    name: _Identifier 
    bases: list[expr] 
    keywords: list[keyword] 
    body: list[stmt] 
    decorator_list: list[expr] 

    def __init__(
        name: _Identifier 
        bases: list[expr] 
        keywords: list[keyword] 
        body: list[stmt] 
        decorator_list: list[expr] 
    ):
        ...

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedAn actionable problem of low to medium complexity where a PR would be very welcomestubs: improvementImprove/refactor existing annotations, other stubs issues

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions