Description
We currently have static types for the fields of most (all?) ast
classes, but none of these have typed constructors, e.g.:
Lines 79 to 86 in 62cde01
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]
):
...