The inference of generic types for classes in most type-checkers assume that all the generic types can be inferred from the parameters to __init__. This is not always the case. For example, it is a common pattern to create an empty container class and add elements to it later, e.g.:
a = []
a.append("hello world")
Currently for builtin classes, such as list or dict, this idiom is understood by MyPy, but not by Pyright. Moreover, even MyPy is incapable of applying this type inference to custom types (see python/mypy#13134). As mentioned in that issue, the problem is not only with empty containers, but also with some widely used APIs, such as the Estimator API from scikit-learn and related projects, in which the type of the data used is only known when the fit method is called.
My proposal would be to add functionality to the type system to define which methods can be used to infer generic types, apart from __init__. This could be made for example with a decorator (e.g. allow_generic_inference), so that one can define a method such as:
@allow_generic_inference
def append(value: T):
...
In this case the value of the class generic parameter T could be inferred from append if it was undefined before.
I think this proposal may also be similar to the previously suggested TypeAssert mentioned by @erictraut in #1013 (comment). However I am not completely sure that TypeAssert could do what I explained here. I am also not sure that the proposed TypeAssert syntax is better than a decorator.
I hope you too consider this proposal useful, and I look forward to your feedback.
The inference of generic types for classes in most type-checkers assume that all the generic types can be inferred from the parameters to
__init__. This is not always the case. For example, it is a common pattern to create an empty container class and add elements to it later, e.g.:Currently for builtin classes, such as
listordict, this idiom is understood by MyPy, but not by Pyright. Moreover, even MyPy is incapable of applying this type inference to custom types (see python/mypy#13134). As mentioned in that issue, the problem is not only with empty containers, but also with some widely used APIs, such as theEstimatorAPI from scikit-learn and related projects, in which the type of the data used is only known when thefitmethod is called.My proposal would be to add functionality to the type system to define which methods can be used to infer generic types, apart from
__init__. This could be made for example with a decorator (e.g.allow_generic_inference), so that one can define a method such as:In this case the value of the class generic parameter
Tcould be inferred fromappendif it was undefined before.I think this proposal may also be similar to the previously suggested
TypeAssertmentioned by @erictraut in #1013 (comment). However I am not completely sure thatTypeAssertcould do what I explained here. I am also not sure that the proposedTypeAssertsyntax is better than a decorator.I hope you too consider this proposal useful, and I look forward to your feedback.