diff --git a/conformance/results/mypy/generics_variance.toml b/conformance/results/mypy/generics_variance.toml
index b9ea3ff47..b21ba9766 100644
--- a/conformance/results/mypy/generics_variance.toml
+++ b/conformance/results/mypy/generics_variance.toml
@@ -1,14 +1,13 @@
conformant = "Partial"
notes = """
-Does not reject a function-scoped TypeVar that is marked as covariant or contravariant.
Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible.
"""
output = """
generics_variance.py:14: error: TypeVar cannot be both covariant and contravariant [misc]
-generics_variance.py:78: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
-generics_variance.py:82: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
-generics_variance.py:94: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
-generics_variance.py:106: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
-generics_variance.py:126: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
-generics_variance.py:132: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
+generics_variance.py:77: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
+generics_variance.py:81: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
+generics_variance.py:93: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
+generics_variance.py:105: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
+generics_variance.py:125: error: Variance of TypeVar "T_co" incompatible with variance in parent type [type-var]
+generics_variance.py:131: error: Variance of TypeVar "T_contra" incompatible with variance in parent type [type-var]
"""
diff --git a/conformance/results/pyre/generics_variance.toml b/conformance/results/pyre/generics_variance.toml
index cc5377b60..49e1e2abc 100644
--- a/conformance/results/pyre/generics_variance.toml
+++ b/conformance/results/pyre/generics_variance.toml
@@ -1,14 +1,13 @@
conformant = "Partial"
notes = """
Does not reject a TypeVar that is defined as both covariant and contravariant.
-Does not reject a function-scoped TypeVar that is marked as covariant or contravariant.
Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible.
"""
output = """
-generics_variance.py:78:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T]` because subclasses cannot use more permissive type variables than their superclasses.
-generics_variance.py:82:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T]` because subclasses cannot use more permissive type variables than their superclasses.
-generics_variance.py:94:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T_co](covariant)` because subclasses cannot use more permissive type variables than their superclasses.
-generics_variance.py:106:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T_contra](contravariant)` because subclasses cannot use more permissive type variables than their superclasses.
-generics_variance.py:126:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T_contra](contravariant)` because subclasses cannot use more permissive type variables than their superclasses.
-generics_variance.py:132:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T_co](covariant)` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:77:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T]` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:81:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T]` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:93:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T_co](covariant)` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:105:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T_contra](contravariant)` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:125:0 Invalid type variance [46]: The type variable `Variable[T_co](covariant)` is incompatible with parent class type variable `Variable[T_contra](contravariant)` because subclasses cannot use more permissive type variables than their superclasses.
+generics_variance.py:131:0 Invalid type variance [46]: The type variable `Variable[T_contra](contravariant)` is incompatible with parent class type variable `Variable[T_co](covariant)` because subclasses cannot use more permissive type variables than their superclasses.
"""
diff --git a/conformance/results/pyright/generics_variance.toml b/conformance/results/pyright/generics_variance.toml
index 23f062cfa..af14dd46a 100644
--- a/conformance/results/pyright/generics_variance.toml
+++ b/conformance/results/pyright/generics_variance.toml
@@ -1,31 +1,28 @@
-conformant = "Partial"
-notes = """
-Does not reject a function-scoped TypeVar that is marked as covariant or contravariant.
-"""
+conformant = "Pass"
output = """
generics_variance.py:14:50 - error: TypeVar cannot be both covariant and contravariant
-generics_variance.py:78:18 - error: Type "T_co@Class1" cannot be assigned to type variable "T@Inv"
+generics_variance.py:77:18 - error: Type "T_co@Class1" cannot be assigned to type variable "T@Inv"
Variance of type argument "T_co@Class1" is incompatible with base class "Inv" (reportGeneralTypeIssues)
-generics_variance.py:82:18 - error: Type "T_contra@Class2" cannot be assigned to type variable "T@Inv"
+generics_variance.py:81:18 - error: Type "T_contra@Class2" cannot be assigned to type variable "T@Inv"
Variance of type argument "T_contra@Class2" is incompatible with base class "Inv" (reportGeneralTypeIssues)
-generics_variance.py:94:20 - error: Type "T_contra@Co_Child3" cannot be assigned to type variable "T_co@Co"
+generics_variance.py:93:20 - error: Type "T_contra@Co_Child3" cannot be assigned to type variable "T_co@Co"
Variance of type argument "T_contra@Co_Child3" is incompatible with base class "Co" (reportGeneralTypeIssues)
-generics_variance.py:106:28 - error: Type "T_co@Contra_Child3" cannot be assigned to type variable "T_contra@Contra"
+generics_variance.py:105:28 - error: Type "T_co@Contra_Child3" cannot be assigned to type variable "T_contra@Contra"
Variance of type argument "T_co@Contra_Child3" is incompatible with base class "Contra" (reportGeneralTypeIssues)
-generics_variance.py:114:28 - error: Type "Co[T_co@Contra_Child5]" cannot be assigned to type variable "T_contra@Contra"
+generics_variance.py:113:28 - error: Type "Co[T_co@Contra_Child5]" cannot be assigned to type variable "T_contra@Contra"
Variance of type argument "Co[T_co@Contra_Child5]" is incompatible with base class "Contra" (reportGeneralTypeIssues)
-generics_variance.py:127:20 - error: Type "T_co@CoContra_Child2" cannot be assigned to type variable "T_contra@CoContra"
+generics_variance.py:126:20 - error: Type "T_co@CoContra_Child2" cannot be assigned to type variable "T_contra@CoContra"
Variance of type argument "T_co@CoContra_Child2" is incompatible with base class "CoContra" (reportGeneralTypeIssues)
-generics_variance.py:133:14 - error: Type "T_contra@CoContra_Child3" cannot be assigned to type variable "T_co@CoContra"
+generics_variance.py:132:14 - error: Type "T_contra@CoContra_Child3" cannot be assigned to type variable "T_co@CoContra"
Variance of type argument "T_contra@CoContra_Child3" is incompatible with base class "CoContra" (reportGeneralTypeIssues)
-generics_variance.py:143:24 - error: Type "Co[T_co@CoContra_Child5]" cannot be assigned to type variable "T_contra@CoContra"
+generics_variance.py:142:24 - error: Type "Co[T_co@CoContra_Child5]" cannot be assigned to type variable "T_contra@CoContra"
Variance of type argument "Co[T_co@CoContra_Child5]" is incompatible with base class "CoContra" (reportGeneralTypeIssues)
-generics_variance.py:164:33 - error: Type "Co[Contra[T_contra@CoToContraToContra]]" cannot be assigned to type variable "T_contra@Contra"
+generics_variance.py:163:33 - error: Type "Co[Contra[T_contra@CoToContraToContra]]" cannot be assigned to type variable "T_contra@Contra"
Variance of type argument "Co[Contra[T_contra@CoToContraToContra]]" is incompatible with base class "Contra" (reportGeneralTypeIssues)
-generics_variance.py:168:37 - error: Type "Contra[Contra[T_co@ContraToContraToContra]]" cannot be assigned to type variable "T_contra@Contra"
+generics_variance.py:167:37 - error: Type "Contra[Contra[T_co@ContraToContraToContra]]" cannot be assigned to type variable "T_contra@Contra"
Variance of type argument "Contra[Contra[T_co@ContraToContraToContra]]" is incompatible with base class "Contra" (reportGeneralTypeIssues)
-generics_variance.py:192:43 - error: Could not specialize type "Contra_TA[T_contra@Contra_TA]"
+generics_variance.py:191:43 - error: Could not specialize type "Contra_TA[T_contra@Contra_TA]"
Variance of type argument "Co_TA[Contra_TA[T_contra@CoToContraToContra_WithTA]]" is incompatible with "T_contra@Contra_TA"
-generics_variance.py:197:15 - error: Could not specialize type "Contra_TA[T_contra@Contra_TA]"
+generics_variance.py:196:15 - error: Could not specialize type "Contra_TA[T_contra@Contra_TA]"
Variance of type argument "Contra_TA[Contra_TA[T_co@ContraToContraToContra_WithTA]]" is incompatible with "T_contra@Contra_TA"
"""
diff --git a/conformance/results/results.html b/conformance/results/results.html
index a51cab917..5a6d22ac8 100644
--- a/conformance/results/results.html
+++ b/conformance/results/results.html
@@ -156,7 +156,7 @@
Python Type System Conformance Test Results
mypy 1.8.0 1.40sec | pyright 1.1.345 1.53sec | pyre 0.9.19 2.53sec | pytype 2023.12.18 31.23sec | |
---|---|---|---|---|
Type annotations | ||||
annotations_coroutines | Pass | Pass | Partial Does not evaluate correct type for async function. | Partial Does not evaluate correct type for async function. |
annotations_forward_refs | Partial Does not report error for a forward reference that is not enclosed in quotes. Does not report error for use of quoted type with "|" operator (runtime error). Incorrectly generates error for quoted type defined in class scope. | Pass | Partial Does not report error for a forward reference that is not enclosed in quotes. Does not report error for use of quoted type with "|" operator (runtime error). Does not reject f-string in quoted type annotation. Incorrectly generates error for quoted type defined in class scope. Does not generate error for unquoted type defined in class scope. | Partial Does not reject some illegal type expression forms when quoted. Incorrectly generates error for quoted type defined in class scope. Evaluates incorrect type for class variable annotated with quoted type expression. |
annotations_generators | Partial Does not report incompatible Generator type in `yield from` statement. | Pass | Partial Does not report invalid return type for generator when function implicitly returns None. Incorrectly evaluates type of call to async generator. | Partial Does not report invalid return type for generator when function implicitly returns None. Reports invalid error when return type of generator is annotated as a compatible protocol. Does not report type violation in `yield from` statement. |
annotations_methods | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. |
annotations_typeexpr | Pass | Pass | Pass | Partial Does not reject call expressions in type annotation. Does not reject call lambda expression in type annotation. Does not reject list expression in type annotation. Does not reject ternary expression in type annotation. Does not reject f-string in type annotation. Does not reject module in type annotation. |
Special types in annotations | ||||
specialtypes_any | Pass | Pass | Partial Does not treat missing type argument as Any in generic type. Does not support Any as a base class. | Pass |
specialtypes_never | Pass | Pass | Partial Does not treat Never as compatible with all other types. | Unsupported Does not understand NoReturn or Never. |
specialtypes_none | Pass | Pass | Partial Does not correctly handle type annotation type[None]. | Partial Does not detect type incompatibility between None and type[None]. Does not detect type incompatibility between None and incompatible protocol. |
specialtypes_promotions | Pass | Pass | Partial Does not reject use of attribute that is compatible only with float. | Pass |
specialtypes_tuple | Pass | Pass | Partial Does not report type violation when assigning tuple[T, ...] to tuple[T]. | Partial Does not report type violation when assigning tuple[T, ...] to tuple[T]. |
specialtypes_tuple_unpack | Pass | Pass | Unsupported Does not support unpacked tuple in type expression. | Unsupported Does not support unpacked tuple in type expression. |
specialtypes_type | Partial Does not treat `type` same as `type[Any]` for assert_type. Does not allow access to unknown attributes from object of type `type[Any]`. | Partial Does not reject Callable when passed to type[T]. | Partial Does not reject Callable when passed to type[T]. Does not treat `type` same as `type[Any]` for assert_type. Does not allow access to unknown attributes from object of type `type[Any]`. Does not reject access to unknown attributes from object of type `Type[object]`. Reports type incompatibility between `type` and `Callable[..., Any]`. | Partial Does not reject Callable when passed to type[T]. Does not allow access to known attributes from object of type `type[Any]`. |
Generics | ||||
generics_paramspec_basic | Partial Does not reject ParamSpec when used "bare" in type alias definition. | Pass | Partial Does not enforce name consistency for ParamSpec assigned to identifier. Incorrectly reports error for legitimate use of ParamSpec in generic type alias. Does not reject ParamSpec when used in various invalid locations. | Unsupported Does not support ParamSpec. |
generics_paramspec_components | Partial Does not report illegal use of "P.args" on normal parameter. Does not report error when P.args is specified but P.kwargs is missing. Does not report error when P is out of scope and P.args and P.kwargs is used. Does not report error when keyword argument is specified between P.args and P.kwargs. Does not report error when calling callable and argument is missing for concatenated parameters. | Pass | Partial Does not report illegal use of "P.args" on normal parameter. Does not report error when P.args is specified but P.kwargs is missing. Does not report error when P is out of scope and P.args and P.kwargs is used. Does not report error when calling callback defined with ParamSpec with incorrect arguments. Does not report error when keyword argument is specified between P.args and P.kwargs. Does not report error when calling callable and argument is missing for concatenated parameters. | Unsupported Does not support ParamSpec. |
generics_paramspec_semantics | Pass | Pass* Constraint solver doesn't find common type for two signatures captured by a single ParamSpec (allowed). | Partial Constraint solver doesn't find common type for two signatures captured by a single ParamSpec (allowed). Reports error for legitimate Callable type annotation that uses Concatenate. Does not evaluate the correct type for call of Callable defined with Concatenate. | Unsupported Does not support ParamSpec. |
generics_paramspec_specialization | Pass | Pass | Partial Reports error for legitimate use of ParamSpec and Concatenate in function signature. Reports error for legitimate specialization of generic class parameterized with ParamSpec. | Unsupported Does not support ParamSpec. |
generics_self_advanced | Partial Does not infer the type of an unannotated `self` parameter to be type `Self`. Does not retain `Self` when calling method that returns `Self`. Does not infer the type of an unannotated `cls` parameter to be type `type[Self]`. Does not retain `Self` when accessing attribute through `type[Self]`. | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_attributes | Pass | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_basic | Partial Does not properly handle constructor call through `cls` parameter. | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_protocols | Pass | Pass | Partial Does not reject protocol compatibility due to method `Self` return type. | Partial Does not reject protocol compatibility due to method `Self` return type. |
generics_self_usage | Pass | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_syntax_compatibility | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_declarations | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_infer_variance | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_scoping | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_typevartuple_args | Partial Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Partial Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_basic | Partial Does not enforce that tuples captured by TypeVarTuple are same length (spec bug?). Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). Does not enforce that tuples captured by TypeVarTuple are invariant in non-tuple class. | Partial Does not enforce that tuples captured by TypeVarTuple are same length (spec bug?). Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_callable | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_concat | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_overloads | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_specialization | Partial Incorrectly reports type incompatibility when generic class is specialized with `*tuple[Any, ...]`. Incorrectly specializes generic alias that includes a TypeVar and TypeVarTuple if no type arguments are provided. Rejects use of unpacked TypeVarTuple in generic type alias definition. Rejects specialization of generic type alias defined as a tuple containing a TypeVar. "More than one Unpack" error message has no line number. Incorrectly evaluates tuple split across a TypeVarTuple and a TypeVar. | Partial Incorrectly reports type incompatibility when generic class is specialized with `*tuple[Any, ...]`. Incorrectly evaluates tuple split across a TypeVarTuple and a TypeVar. | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_unpack | Partial Does not reject multiple unpack operators in a tuple. | Partial Does not treat `tuple[Any, ...]` as having an arbitrary length. | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_variance | Partial Does not reject a function-scoped TypeVar that is marked as covariant or contravariant. Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible. | Partial Does not reject a function-scoped TypeVar that is marked as covariant or contravariant. | Partial Does not reject a TypeVar that is defined as both covariant and contravariant. Does not reject a function-scoped TypeVar that is marked as covariant or contravariant. Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible. | Unsupported Does not support covariant or contravariant TypeVars. |
generics_variance_inference | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
Type qualifiers | ||||
qualifiers_annotated | Partial Does not allow ClassVar to be nested within Annotated. Does not allow Final to be nested within Annotated. Does not allow Required and NotRequired to be nested within Annotated. | Pass | Partial Does not reject Annotated with a single parameter. | Partial Does not reject some illegal type expression forms used in Annotated. Does not allow TypeVar to be used in type alias when wrapped with Annotated. |
qualifiers_final_annotation | Partial Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition. Does not allow conditional assignment of Final instance variable in __init__ method. Does not allow redefinition of private class variable that is marked Final in parent class. Does not report modification of local Final variable via "for" statement. | Pass | Partial Does not report Final variable with missing initialization in module scope. Does not report error for invalid nesting of Final and ClassVar. Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition. | Partial Does not report Final variable with missing initialization. Does not reject Final instance variable declared outside of __init__ method. Does not reject modification of global variable declared Final. Does not reject modification of local variable declared Final. |
qualifiers_final_decorator | Pass | Pass | Partial Reports error for overloaded method implementation marked @final if its overloads do not. Does not report error for overloaded @final method defined in stub file. Reports misleading error when overload is marked @final but implementation is not. | Partial Does not report error for overloaded @final method defined in stub file. Does not report error for overload that is marked @final when implementation is not. |
Class type compatibility | ||||
classes_classvar | Partial Internal error if TypeVarTuple is used in ClassVar. Does not reject use of ParamSpec in ClassVar. Rejects ClassVar nested in Annotated. Does not reject use of ClassVar in TypeAlias definition. Does not infer type of ClassVar from assignment if no type is provided. | Pass | Partial Does not reject use of TypeVar in ClassVar. Does not reject use of ParamSpec in ClassVar. Does not reject use of ClassVar as a generic type argument. Does not reject use of ClassVar in parameter type annotation. Does not reject use of ClassVar in local variable annotation. Does not reject use of ClassVar in instance variable annotation. Does not reject use of ClassVar in return type annotation. Does not reject use of ClassVar in type alias definition. | Partial Does not reject use of TypeVar in ClassVar. Does not reject use of ParamSpec in ClassVar. Does not reject use of ClassVar as a generic type argument. Rejects initialization of ClassVar if no type argument is provided. Does not reject use of ClassVar in parameter type annotation. Does not reject use of ClassVar in local variable annotation. Does not reject use of ClassVar in instance variable annotation. Does not reject use of ClassVar in return type annotation. Does not reject use of ClassVar in type alias definition. Does not reject assignment of ClassVar through instance of class. |
classes_override | Partial Does not handle case where parent class derives from Any. | Pass | Unsupported Does not yet support the @override decorator. | Unsupported Does not yet support the @override decorator. |
Type aliases | ||||
aliases_explicit | Partial Does not reject specialization of type alias that has already been implicitly specialized. | Pass | Partial Incorrectly reports error for type alias defined with ParamSpec. Incorrectly rejects some valid type aliases when used in annotations. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report some illegal annotation forms as invalid type aliases. Does not report invalid specialization of generic type aliases. Incorrectly rejects import alias of `TypeAlias` when used to define type alias. Does not report invalid specialization of already-specialized generic type alias. | Partial Incorrectly reports error for type alias defined with ParamSpec. Does not report invalid specialization of generic type alias with bound TypeVar. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report some illegal annotation forms as invalid type aliases. Does not report invalid specialization of already-specialized generic type alias. |
aliases_implicit | Pass | Pass | Partial Incorrectly reports error for type alias defined with ParamSpec. Incorrectly rejects some valid type aliases when used in annotations. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report invalid specialization of generic type aliases. Does not report error for attempt to instantiate union type alias. Does not report invalid specialization of already-specialized generic type alias. | Partial Incorrectly reports error for type alias defined with ParamSpec. Does not report invalid specialization of generic type alias with bound TypeVar. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Allows some illegal annotation forms to be interpreted as valid type aliases. Does not report invalid specialization of already-specialized generic type alias. |
aliases_newtype | Pass | Pass | Partial Does not reject use of NewType in `isinstance` call. Does not reject use of NewType in class definition statement. Does not report inconsistency between name of NewType and assigned identifier name. Does not reject use of NewType with generic class with TypeVar. Does not reject use of NewType with protocol class. Does not reject use of NewType with TypedDict class. Does not reject use of NewType with another NewType. Does not reject use of NewType with Any. | Partial Does not reject use of NewType in `isinstance` call. Does not reject use of NewType in class definition statement. Does not report inconsistency between name of NewType and assigned identifier name. Does not reject use of NewType with generic class with TypeVar. Does not reject use of NewType with protocol class. Does not reject use of NewType with TypedDict class. Does not reject use of NewType with another NewType. Does not reject use of NewType with Any. |
aliases_recursive | Pass | Pass | Partial Does not properly handle some recursive type aliases. Does not properly handle specialization of generic recursive type aliases. | Partial Does not detect type violation for some deeply-nested types. Does not properly handle `|` for unions in some recursive type alias definitions. Does not detect cyclical references in recursive type alias definition. |
aliases_type_statement | Unsupported Does not support `type` statement. | Pass | Unsupported Does not support `type` statement. | Unsupported Does not support `type` statement. |
aliases_typealiastype | Unsupported Support for TypeAliasType is not implemented. | Pass | Unsupported Support for TypeAliasType is not implemented. | Unsupported Support for TypeAliasType is not implemented. |
aliases_variance | Pass | Pass | Pass | Unsupported Does not detect variance incompatibility. |
Literals | ||||
literals_interactions | Partial Does not narrow type of `x` with `x in Literal` type guard pattern. | Pass | Partial Does not detect out-of-bound tuple literal index. Does not narrow type of `x` with `x in Literal` type guard pattern. Does not narrow type of `x` with `x == Literal` type guard pattern. | Partial Incorrectly rejects some legal Literal annotations. Does not reject some illegal Literal annotations. Does not use Literal to distinguish overloads. Does not narrow based on `x is Literal` type guard pattern. Does not narrow based on `x == Literal` type guard pattern. |
literals_literalstring | Unsupported Support for `LiteralString` is not implemented. | Pass | Pass | Unsupported Does not understand `LiteralString` special form. |
literals_parameterizations | Partial Does not reject tuple within Literal. | Pass | Partial Does not support type aliases in Literal type expression. Does not support nested Literal type expression. Does not reject unary + operator in Literal type expression. Does not reject tuple in Literal type expression. Does not reject "bare" Literal in type expression. | Unsupported Does not understand `Literal` type annotation. |
literals_semantics | Pass | Pass | Partial Does not reject augmented operation that modifies literal value. | Unsupported Does not understand `Literal` type annotation. |
Protocols | ||||
protocols_class_objects | Pass | Partial Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. | Partial Does not reject protocol class assigned to type[Proto]. Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. | Partial Does not reject protocol class assigned to type[Proto]. Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. |
protocols_definition | Partial Does not detect protocol mismatch if concrete method is missing annotations. Does not detect protocol mismatch if concrete method's parameters are position-only. | Pass | Partial Does not reject ClassVar in concrete class when attribute in protocol is not ClassVar or vice versa. Does not reject read-only property in concrete class when attribute in protocol is mutable. Does not reject covariant attribute type when protocol attribute is mutable. Does not reject read-only property in concrete class when protocol has settable property. Does not reject immutable named tuple attribute in concrete class when protocol attribute is mutable. Does not reject immutable frozen dataclass attribute in concrete class when protocol attribute is mutable. | Partial Reports errors for protocol static method with "..." implementation. Does not report error when instance variable is set through "self" access in protocol class. Does not report protocol mismatch when concrete class has attribute with covariant type and protocol attribute is mutable. Does not reject ClassVar in concrete class when attribute in protocol is not ClassVar. Does not reject read-only property in concrete class when attribute in protocol is mutable. Does not reject covariant attribute type when protocol attribute is mutable. Does not detect protocol mismatch if concrete method is missing annotations. Does not detect protocol mismatch if concrete method's parameters are keyword-only. Does not detect protocol mismatch if concrete method's parameters are position-only. Does not detect protocol mismatch if concrete method is a classmethod. Does not detect protocol mismatch if concrete method is a staticmethod. Does not reject read-only property in concrete class when protocol has settable property. Does not reject immutable named tuple attribute in concrete class when protocol attribute is mutable. Does not reject immutable frozen dataclass attribute in concrete class when protocol attribute is mutable. |
protocols_explicit | Pass* Does not report unimplemented attributes for class that explicitly derives from protocol until it is instantiated. | Pass | Partial Does not report error when calling unimplemented protocol method from derived class. Does not report error when method is not implemented in derived class. | Partial Reports errors for protocol static method with "..." implementation. Does not report error when calling unimplemented protocol method from derived class. Does not report type incompatibility when assigning to attribute defined in protocol. Does not reject instantiation of class that derives from protocol but doesn't implement attribute. Does not report instantiation of class that derives from protocol but doesn't implement method. |
protocols_generic | Partial Fails protocol matching when method-scoped TypeVar is used in protocol. | Pass | Partial Does not reject the use of Protocol and Generic together as base classes. Does not detect protocol mismatch when method-scoped TypeVar is used in protocol. | Partial Does not correctly enforce contravariance in protocol type compatibility tests. Does not correctly enforce invariance in protocol type compatibility tests. Does not detect protocol mismatch when method-scoped TypeVar is used in protocol. |
protocols_merging | Pass | Pass | Partial Does not reject a protocol class that derives from a non-protocol class. | Partial Does not reject a protocol class that derives from a non-protocol class. Does not report attempt to instantiate abstract class downgraded from protocol class. |
protocols_modules | Pass | Pass | Unsupported Does not perform protocol checks for modules. | Partial Does not report incompatibilities for protocol methods. |
protocols_recursive | Pass | Pass | Pass | Partial Incorrectly reports type error for some recursive protocols. |
protocols_runtime_checkable | Partial Does not report unsafe overlap for runtime_checkable protocol. | Partial Does not reject issubclass call for data protocol if included in tuple. | Unsupported Does not reject isinstance or issubclass call for protocol that is not runtime_checkable. Does not reject issubclass call for data protocol. Does not report unsafe overlap for runtime_checkable protocol. | Unsupported Does not reject isinstance or issubclass call for protocol that is not runtime_checkable. Does not reject issubclass call for data protocol. Does not report unsafe overlap for runtime_checkable protocol. |
protocols_self | Pass | Pass | Pass | Partial Does not properly handle Self type within a protocol. |
protocols_subtyping | Pass | Pass | Pass | Partial Does not reject attempt to instantiate protocol class. Does not report some protocol type compatibility violations involving contravariance. |
protocols_variance | Pass | Partial Calculates incorrect variance when `self` or `cls` have explicit annotation. | Unsupported Does not detect incorrect TypeVar variance within generic protocols. | Unsupported Does not detect incorrect TypeVar variance within generic protocols. |
Callables | ||||
callables_annotation | Pass | Pass | Partial Does not evaluate correct type for `*args: int` parameter. Does not reject illegal form `Callable[[...], int]`. | Pass |
callables_kwargs | Pass | Pass | Unsupported Does not understand Unpack in the context of **kwargs annotation. | Unsupported Does not understand Unpack in the context of **kwargs annotation. |
callables_protocol | Pass | Pass | Partial Does not correctly handle callback protocol that declares attributes in all functions. Does not report type incompatibility for callback protocol with positional-only parameters. Incorrectly reports type compatibility error with callback that has *args and **kwargs. Does not report type incompatibility for callback missing a default argument for positional parameter. Does not report type incompatibility for callback missing a default argument for keyword parameter. | Unsupported Does not properly handle type compatibility checks with callback protocols. |
Overloads | ||||
overloads_basic | Pass | Pass | Partial Does not reject a function with a single @overload signature. | Partial Does not reject a function with a single @overload signature. Does not reject a function with @overload signature but no implementation. |
Dataclasses | ||||
dataclasses_descriptors | Partial Does not correctly evaluate type of descriptor access. | Pass | Partial Incorrectly generates error when calling constructor of dataclass with descriptor. | Unsupported Does not understand descriptor objects in dataclass. |
dataclasses_frozen | Pass | Pass | Partial Does not reject frozen dataclass inherited from non-frozen dataclass. Does not reject non-frozen dataclass inherited from frozen dataclass. | Unsupported Does not report assignment to field within frozen dataclass instance. Does not reject frozen dataclass inherited from non-frozen dataclass. Does not reject non-frozen dataclass inherited from frozen dataclass. |
dataclasses_hash | Partial Does not report when dataclass is not compatible with Hashable protocol. | Pass | Partial Does not report when dataclass is not compatible with Hashable protocol. | Partial Does not report when dataclass is not compatible with Hashable protocol. |
dataclasses_inheritance | Pass | Pass | Partial Does not reject ClassVar that is overridden by instance variable. Does not reject instance variable that is overridden by ClassVar. | Partial Does not reject ClassVar that is overridden by instance variable. Does not reject instance variable that is overridden by ClassVar. |
dataclasses_kwonly | Partial Incorrectly rejects kw_only field with default before positional field. | Pass | Pass | Partial Incorrectly reports error when kw_only field has default value. Incorrectly rejects kw_only field with default before positional field. |
dataclasses_order | Pass | Pass | Partial Does not report type incompatibility with comparison operator. | Partial Does not report type incompatibility with comparison operator. |
dataclasses_postinit | Pass | Pass | Unsupported Does not perform validation of `__post_init__` method. Does not reject access of `InitVar` from object. | Partial Does not validate `__post_init__` method. Reports incorrect error for incompatible `__post_init__` method override. |
dataclasses_slots | Partial Does not reject write to instance variable that is not defined in __slots__. | Pass | Partial Does not report error when `slots=True` is used with `__slots__` definition. Does not reject write to instance variable that is not defined in __slots__. Does not reject access to `__slots__` from dataclass instance when `slots=False`. | Partial Does not report error when `slots=True` is used with `__slots__` definition. Does not reject write to instance variable that is not defined in __slots__. Incorrectly reports error when accessing `__slots__` when `slots=True`. |
dataclasses_transform_class | Pass | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_field | Partial Does not properly handle field constructor that has default value for `kw_only` or `init` parameter. | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_func | Partial Does not handle `kw_only=False` override when `kw_only_default=True`. Does not report error when `order=False` and comparison operators are used. | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_meta | Pass | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_usage | Pass | Pass | Partial Does not report error when field with no default follows field with default. Incorrectly reports error with InitVar that has default value. | Pass |
Typed dictionaries | ||||
typeddicts_alt_syntax | Pass* Does not support keyword-argument form of alternative syntax (deprecated in 3.11). | Pass | Partial Does not report when name of TypedDict doesn't match assigned identifier name. Does not support keyword-argument form of alternative syntax (deprecated in 3.11). | Partial Does not reject use of variable as second argument to `TypedDict` call. Does not report when name of TypedDict doesn't match assigned identifier name. Does not support keyword-argument form of alternative syntax (deprecated in 3.11). |
typeddicts_class_syntax | Pass | Pass | Partial Does not reject methods within TypedDict class. Does not report when metaclass is provided. Does not report when other keyword argument is provided. Does not support generic TypedDict class. | Partial Does not reject methods within TypedDict class. Does not report when metaclass is provided. Does not report when other keyword argument is provided. |
typeddicts_final | Pass | Pass | Partial Does not handle value with literal type as index to TypedDict object. | Pass |
typeddicts_inheritance | Pass | Pass | Partial Does not reject TypedDict class that inherits from non-TypedDict class. | Pass |
typeddicts_operations | Pass | Pass | Pass | Partial Does not report type violation with TypedDict value assignment. Does not report reference to unknown key in TypedDict. Does not reject `clear` method on TypedDict with required keys. Does not reject delete operation for required key in TypedDict. |
typeddicts_required | Partial Does not support nesting of `Annotated` and `Required` or `NotRequired`. | Pass | Partial Does not reject use of `Required` in function parameter annotation. Does not reject nested use of `Required` in type annotation. Does not support recursive TypedDict definitions. | Partial Does not reject use of `Required` in non-TypedDict class. Does not reject use of `Required` in function parameter annotation. Does not reject nested use of `Required` in type annotation. |
typeddicts_type_consistency | Pass | Pass | Partial Does not reject assignment of TypedDict with missing key. Does not return non-Optional value from `get` method for required key. Does not properly handle nested TypedDicts. | Partial Does not report some type violations for TypedDict type compatibility. Incorrectly reports type violation in cases where there is none. Does not report type incompatibility between TypedDict and `dict[str, Any]`. |
typeddicts_usage | Pass | Pass | Partial Does not report errant use of TypedDict in `isinstance` call. Does not reject use of TypedDict as TypeVar bound. | Partial Does not report errant use of TypedDict in `isinstance` call. Does not reject use of TypedDict as TypeVar bound. |
Type narrowing | ||||
narrowing_typeguard | Pass | Pass | Partial Does not support `tuple` in `assert_type` call. Does not reject TypeGuard method with too few parameters. | Partial Does not reject TypeGuard method with too few parameters. |
Type checker directives | ||||
directives_assert_type | Pass | Pass | Unsupported Does not understand "assert_type". | Pass |
directives_cast | Pass | Pass | Pass | Partial Does not reject a call to "cast" with additional arguments. |
directives_no_type_check | Partial Does not honor `@no_type_check` class decorator. | Unsupported Intentionally does not honor @no_type_check decorator. | Unsupported Does not honor @no_type_check decorator. | Unsupported Does not honor @no_type_check decorator. |
directives_reveal_type | Pass | Pass | Unsupported Does not understand reveal_type call. | Partial Does not reject call to reveal_type with zero arguments. Does not reject call to reveal_type with too many arguments. |
directives_type_checking | Pass | Pass | Pass | Pass |
directives_type_ignore | Partial Does not honor "# type: ignore" comment if comment includes additional text. | Pass | Pass | Partial Does not honor "# type: ignore" comment if comment includes additional text. |
directives_type_ignore_file1 | Pass | Pass | Unsupported Does not support file-level `#type: ignore` comment. | Pass |
directives_type_ignore_file2 | Pass | Pass | Pass | Partial Does not ignore `# type: ignore` if it occurs after docstrings in the file. |
directives_version_platform | Pass* Does not understand three-element form of sys.version checks. Does not understand os.name checks. | Pass | Partial Does not support sys.platform checks. Does not support os.name checks. | Pass* Does not understand three-element form of sys.version checks. Does not understand os.name checks. |
mypy 1.8.0 1.32sec | pyright 1.1.345 1.32sec | pyre 0.9.19 2.21sec | pytype 2023.12.18 32.06sec | |
---|---|---|---|---|
Type annotations | ||||
annotations_coroutines | Pass | Pass | Partial Does not evaluate correct type for async function. | Partial Does not evaluate correct type for async function. |
annotations_forward_refs | Partial Does not report error for a forward reference that is not enclosed in quotes. Does not report error for use of quoted type with "|" operator (runtime error). Incorrectly generates error for quoted type defined in class scope. | Pass | Partial Does not report error for a forward reference that is not enclosed in quotes. Does not report error for use of quoted type with "|" operator (runtime error). Does not reject f-string in quoted type annotation. Incorrectly generates error for quoted type defined in class scope. Does not generate error for unquoted type defined in class scope. | Partial Does not reject some illegal type expression forms when quoted. Incorrectly generates error for quoted type defined in class scope. Evaluates incorrect type for class variable annotated with quoted type expression. |
annotations_generators | Partial Does not report incompatible Generator type in `yield from` statement. | Pass | Partial Does not report invalid return type for generator when function implicitly returns None. Incorrectly evaluates type of call to async generator. | Partial Does not report invalid return type for generator when function implicitly returns None. Reports invalid error when return type of generator is annotated as a compatible protocol. Does not report type violation in `yield from` statement. |
annotations_methods | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. | Pass* Type evaluation differs from other type checkers because of ambiguity in the spec related to method bindings. |
annotations_typeexpr | Pass | Pass | Pass | Partial Does not reject call expressions in type annotation. Does not reject call lambda expression in type annotation. Does not reject list expression in type annotation. Does not reject ternary expression in type annotation. Does not reject f-string in type annotation. Does not reject module in type annotation. |
Special types in annotations | ||||
specialtypes_any | Pass | Pass | Partial Does not treat missing type argument as Any in generic type. Does not support Any as a base class. | Pass |
specialtypes_never | Pass | Pass | Partial Does not treat Never as compatible with all other types. | Unsupported Does not understand NoReturn or Never. |
specialtypes_none | Pass | Pass | Partial Does not correctly handle type annotation type[None]. | Partial Does not detect type incompatibility between None and type[None]. Does not detect type incompatibility between None and incompatible protocol. |
specialtypes_promotions | Pass | Pass | Partial Does not reject use of attribute that is compatible only with float. | Pass |
specialtypes_tuple | Pass | Pass | Partial Does not report type violation when assigning tuple[T, ...] to tuple[T]. | Partial Does not report type violation when assigning tuple[T, ...] to tuple[T]. |
specialtypes_tuple_unpack | Pass | Pass | Unsupported Does not support unpacked tuple in type expression. | Unsupported Does not support unpacked tuple in type expression. |
specialtypes_type | Partial Does not treat `type` same as `type[Any]` for assert_type. Does not allow access to unknown attributes from object of type `type[Any]`. | Partial Does not reject Callable when passed to type[T]. | Partial Does not reject Callable when passed to type[T]. Does not treat `type` same as `type[Any]` for assert_type. Does not allow access to unknown attributes from object of type `type[Any]`. Does not reject access to unknown attributes from object of type `Type[object]`. Reports type incompatibility between `type` and `Callable[..., Any]`. | Partial Does not reject Callable when passed to type[T]. Does not allow access to known attributes from object of type `type[Any]`. |
Generics | ||||
generics_paramspec_basic | Partial Does not reject ParamSpec when used "bare" in type alias definition. | Pass | Partial Does not enforce name consistency for ParamSpec assigned to identifier. Incorrectly reports error for legitimate use of ParamSpec in generic type alias. Does not reject ParamSpec when used in various invalid locations. | Unsupported Does not support ParamSpec. |
generics_paramspec_components | Partial Does not report illegal use of "P.args" on normal parameter. Does not report error when P.args is specified but P.kwargs is missing. Does not report error when P is out of scope and P.args and P.kwargs is used. Does not report error when keyword argument is specified between P.args and P.kwargs. Does not report error when calling callable and argument is missing for concatenated parameters. | Pass | Partial Does not report illegal use of "P.args" on normal parameter. Does not report error when P.args is specified but P.kwargs is missing. Does not report error when P is out of scope and P.args and P.kwargs is used. Does not report error when calling callback defined with ParamSpec with incorrect arguments. Does not report error when keyword argument is specified between P.args and P.kwargs. Does not report error when calling callable and argument is missing for concatenated parameters. | Unsupported Does not support ParamSpec. |
generics_paramspec_semantics | Pass | Pass* Constraint solver doesn't find common type for two signatures captured by a single ParamSpec (allowed). | Partial Constraint solver doesn't find common type for two signatures captured by a single ParamSpec (allowed). Reports error for legitimate Callable type annotation that uses Concatenate. Does not evaluate the correct type for call of Callable defined with Concatenate. | Unsupported Does not support ParamSpec. |
generics_paramspec_specialization | Pass | Pass | Partial Reports error for legitimate use of ParamSpec and Concatenate in function signature. Reports error for legitimate specialization of generic class parameterized with ParamSpec. | Unsupported Does not support ParamSpec. |
generics_self_advanced | Partial Does not infer the type of an unannotated `self` parameter to be type `Self`. Does not retain `Self` when calling method that returns `Self`. Does not infer the type of an unannotated `cls` parameter to be type `type[Self]`. Does not retain `Self` when accessing attribute through `type[Self]`. | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_attributes | Pass | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_basic | Partial Does not properly handle constructor call through `cls` parameter. | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_self_protocols | Pass | Pass | Partial Does not reject protocol compatibility due to method `Self` return type. | Partial Does not reject protocol compatibility due to method `Self` return type. |
generics_self_usage | Pass | Pass | Unsupported Does not understand `Self` type. | Unsupported Does not understand `Self` type. |
generics_syntax_compatibility | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_declarations | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_infer_variance | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_syntax_scoping | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
generics_typevartuple_args | Partial Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Partial Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_basic | Partial Does not enforce that tuples captured by TypeVarTuple are same length (spec bug?). Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). Does not enforce that tuples captured by TypeVarTuple are invariant in non-tuple class. | Partial Does not enforce that tuples captured by TypeVarTuple are same length (spec bug?). Does not enforce that tuples captured by TypeVarTuple are same type (spec bug?). | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_callable | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_concat | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_overloads | Pass | Pass | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_specialization | Partial Incorrectly reports type incompatibility when generic class is specialized with `*tuple[Any, ...]`. Incorrectly specializes generic alias that includes a TypeVar and TypeVarTuple if no type arguments are provided. Rejects use of unpacked TypeVarTuple in generic type alias definition. Rejects specialization of generic type alias defined as a tuple containing a TypeVar. "More than one Unpack" error message has no line number. Incorrectly evaluates tuple split across a TypeVarTuple and a TypeVar. | Partial Incorrectly reports type incompatibility when generic class is specialized with `*tuple[Any, ...]`. Incorrectly evaluates tuple split across a TypeVarTuple and a TypeVar. | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_typevartuple_unpack | Partial Does not reject multiple unpack operators in a tuple. | Partial Does not treat `tuple[Any, ...]` as having an arbitrary length. | Unsupported Does not support TypeVarTuple. | Unsupported Does not support TypeVarTuple. |
generics_variance | Partial Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible. | Pass | Partial Does not reject a TypeVar that is defined as both covariant and contravariant. Does not reject use of class-scoped TypeVar used in a base class when variance is incompatible. | Unsupported Does not support covariant or contravariant TypeVars. |
generics_variance_inference | Unsupported Type parameter syntax not yet support. | Pass | Unsupported Type parameter syntax not yet support. | Unsupported Type parameter syntax not yet support. |
Type qualifiers | ||||
qualifiers_annotated | Partial Does not allow ClassVar to be nested within Annotated. Does not allow Final to be nested within Annotated. Does not allow Required and NotRequired to be nested within Annotated. | Pass | Partial Does not reject Annotated with a single parameter. | Partial Does not reject some illegal type expression forms used in Annotated. Does not allow TypeVar to be used in type alias when wrapped with Annotated. |
qualifiers_final_annotation | Partial Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition. Does not allow conditional assignment of Final instance variable in __init__ method. Does not allow redefinition of private class variable that is marked Final in parent class. Does not report modification of local Final variable via "for" statement. | Pass | Partial Does not report Final variable with missing initialization in module scope. Does not report error for invalid nesting of Final and ClassVar. Does not treat use of Final name as if it was replaced by the literal in NamedTuple definition. | Partial Does not report Final variable with missing initialization. Does not reject Final instance variable declared outside of __init__ method. Does not reject modification of global variable declared Final. Does not reject modification of local variable declared Final. |
qualifiers_final_decorator | Pass | Pass | Partial Reports error for overloaded method implementation marked @final if its overloads do not. Does not report error for overloaded @final method defined in stub file. Reports misleading error when overload is marked @final but implementation is not. | Partial Does not report error for overloaded @final method defined in stub file. Does not report error for overload that is marked @final when implementation is not. |
Class type compatibility | ||||
classes_classvar | Partial Internal error if TypeVarTuple is used in ClassVar. Does not reject use of ParamSpec in ClassVar. Rejects ClassVar nested in Annotated. Does not reject use of ClassVar in TypeAlias definition. Does not infer type of ClassVar from assignment if no type is provided. | Pass | Partial Does not reject use of TypeVar in ClassVar. Does not reject use of ParamSpec in ClassVar. Does not reject use of ClassVar as a generic type argument. Does not reject use of ClassVar in parameter type annotation. Does not reject use of ClassVar in local variable annotation. Does not reject use of ClassVar in instance variable annotation. Does not reject use of ClassVar in return type annotation. Does not reject use of ClassVar in type alias definition. | Partial Does not reject use of TypeVar in ClassVar. Does not reject use of ParamSpec in ClassVar. Does not reject use of ClassVar as a generic type argument. Rejects initialization of ClassVar if no type argument is provided. Does not reject use of ClassVar in parameter type annotation. Does not reject use of ClassVar in local variable annotation. Does not reject use of ClassVar in instance variable annotation. Does not reject use of ClassVar in return type annotation. Does not reject use of ClassVar in type alias definition. Does not reject assignment of ClassVar through instance of class. |
classes_override | Partial Does not handle case where parent class derives from Any. | Pass | Unsupported Does not yet support the @override decorator. | Unsupported Does not yet support the @override decorator. |
Type aliases | ||||
aliases_explicit | Partial Does not reject specialization of type alias that has already been implicitly specialized. | Pass | Partial Incorrectly reports error for type alias defined with ParamSpec. Incorrectly rejects some valid type aliases when used in annotations. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report some illegal annotation forms as invalid type aliases. Does not report invalid specialization of generic type aliases. Incorrectly rejects import alias of `TypeAlias` when used to define type alias. Does not report invalid specialization of already-specialized generic type alias. | Partial Incorrectly reports error for type alias defined with ParamSpec. Does not report invalid specialization of generic type alias with bound TypeVar. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report some illegal annotation forms as invalid type aliases. Does not report invalid specialization of already-specialized generic type alias. |
aliases_implicit | Pass | Pass | Partial Incorrectly reports error for type alias defined with ParamSpec. Incorrectly rejects some valid type aliases when used in annotations. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Does not report invalid specialization of generic type aliases. Does not report error for attempt to instantiate union type alias. Does not report invalid specialization of already-specialized generic type alias. | Partial Incorrectly reports error for type alias defined with ParamSpec. Does not report invalid specialization of generic type alias with bound TypeVar. Incorrectly evaluates generic type alias with ParamSpec with missing type argument. Allows some illegal annotation forms to be interpreted as valid type aliases. Does not report invalid specialization of already-specialized generic type alias. |
aliases_newtype | Pass | Pass | Partial Does not reject use of NewType in `isinstance` call. Does not reject use of NewType in class definition statement. Does not report inconsistency between name of NewType and assigned identifier name. Does not reject use of NewType with generic class with TypeVar. Does not reject use of NewType with protocol class. Does not reject use of NewType with TypedDict class. Does not reject use of NewType with another NewType. Does not reject use of NewType with Any. | Partial Does not reject use of NewType in `isinstance` call. Does not reject use of NewType in class definition statement. Does not report inconsistency between name of NewType and assigned identifier name. Does not reject use of NewType with generic class with TypeVar. Does not reject use of NewType with protocol class. Does not reject use of NewType with TypedDict class. Does not reject use of NewType with another NewType. Does not reject use of NewType with Any. |
aliases_recursive | Pass | Pass | Partial Does not properly handle some recursive type aliases. Does not properly handle specialization of generic recursive type aliases. | Partial Does not detect type violation for some deeply-nested types. Does not properly handle `|` for unions in some recursive type alias definitions. Does not detect cyclical references in recursive type alias definition. |
aliases_type_statement | Unsupported Does not support `type` statement. | Pass | Unsupported Does not support `type` statement. | Unsupported Does not support `type` statement. |
aliases_typealiastype | Unsupported Support for TypeAliasType is not implemented. | Pass | Unsupported Support for TypeAliasType is not implemented. | Unsupported Support for TypeAliasType is not implemented. |
aliases_variance | Pass | Pass | Pass | Unsupported Does not detect variance incompatibility. |
Literals | ||||
literals_interactions | Partial Does not narrow type of `x` with `x in Literal` type guard pattern. | Pass | Partial Does not detect out-of-bound tuple literal index. Does not narrow type of `x` with `x in Literal` type guard pattern. Does not narrow type of `x` with `x == Literal` type guard pattern. | Partial Incorrectly rejects some legal Literal annotations. Does not reject some illegal Literal annotations. Does not use Literal to distinguish overloads. Does not narrow based on `x is Literal` type guard pattern. Does not narrow based on `x == Literal` type guard pattern. |
literals_literalstring | Unsupported Support for `LiteralString` is not implemented. | Pass | Pass | Unsupported Does not understand `LiteralString` special form. |
literals_parameterizations | Partial Does not reject tuple within Literal. | Pass | Partial Does not support type aliases in Literal type expression. Does not support nested Literal type expression. Does not reject unary + operator in Literal type expression. Does not reject tuple in Literal type expression. Does not reject "bare" Literal in type expression. | Unsupported Does not understand `Literal` type annotation. |
literals_semantics | Pass | Pass | Partial Does not reject augmented operation that modifies literal value. | Unsupported Does not understand `Literal` type annotation. |
Protocols | ||||
protocols_class_objects | Pass | Partial Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. | Partial Does not reject protocol class assigned to type[Proto]. Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. | Partial Does not reject protocol class assigned to type[Proto]. Incorrectly reports some class objects as incompatible with a protocol. Fails to report some class objects as incompatible with a protocol. |
protocols_definition | Partial Does not detect protocol mismatch if concrete method is missing annotations. Does not detect protocol mismatch if concrete method's parameters are position-only. | Pass | Partial Does not reject ClassVar in concrete class when attribute in protocol is not ClassVar or vice versa. Does not reject read-only property in concrete class when attribute in protocol is mutable. Does not reject covariant attribute type when protocol attribute is mutable. Does not reject read-only property in concrete class when protocol has settable property. Does not reject immutable named tuple attribute in concrete class when protocol attribute is mutable. Does not reject immutable frozen dataclass attribute in concrete class when protocol attribute is mutable. | Partial Reports errors for protocol static method with "..." implementation. Does not report error when instance variable is set through "self" access in protocol class. Does not report protocol mismatch when concrete class has attribute with covariant type and protocol attribute is mutable. Does not reject ClassVar in concrete class when attribute in protocol is not ClassVar. Does not reject read-only property in concrete class when attribute in protocol is mutable. Does not reject covariant attribute type when protocol attribute is mutable. Does not detect protocol mismatch if concrete method is missing annotations. Does not detect protocol mismatch if concrete method's parameters are keyword-only. Does not detect protocol mismatch if concrete method's parameters are position-only. Does not detect protocol mismatch if concrete method is a classmethod. Does not detect protocol mismatch if concrete method is a staticmethod. Does not reject read-only property in concrete class when protocol has settable property. Does not reject immutable named tuple attribute in concrete class when protocol attribute is mutable. Does not reject immutable frozen dataclass attribute in concrete class when protocol attribute is mutable. |
protocols_explicit | Pass* Does not report unimplemented attributes for class that explicitly derives from protocol until it is instantiated. | Pass | Partial Does not report error when calling unimplemented protocol method from derived class. Does not report error when method is not implemented in derived class. | Partial Reports errors for protocol static method with "..." implementation. Does not report error when calling unimplemented protocol method from derived class. Does not report type incompatibility when assigning to attribute defined in protocol. Does not reject instantiation of class that derives from protocol but doesn't implement attribute. Does not report instantiation of class that derives from protocol but doesn't implement method. |
protocols_generic | Partial Fails protocol matching when method-scoped TypeVar is used in protocol. | Pass | Partial Does not reject the use of Protocol and Generic together as base classes. Does not detect protocol mismatch when method-scoped TypeVar is used in protocol. | Partial Does not correctly enforce contravariance in protocol type compatibility tests. Does not correctly enforce invariance in protocol type compatibility tests. Does not detect protocol mismatch when method-scoped TypeVar is used in protocol. |
protocols_merging | Pass | Pass | Partial Does not reject a protocol class that derives from a non-protocol class. | Partial Does not reject a protocol class that derives from a non-protocol class. Does not report attempt to instantiate abstract class downgraded from protocol class. |
protocols_modules | Pass | Pass | Unsupported Does not perform protocol checks for modules. | Partial Does not report incompatibilities for protocol methods. |
protocols_recursive | Pass | Pass | Pass | Partial Incorrectly reports type error for some recursive protocols. |
protocols_runtime_checkable | Partial Does not report unsafe overlap for runtime_checkable protocol. | Partial Does not reject issubclass call for data protocol if included in tuple. | Unsupported Does not reject isinstance or issubclass call for protocol that is not runtime_checkable. Does not reject issubclass call for data protocol. Does not report unsafe overlap for runtime_checkable protocol. | Unsupported Does not reject isinstance or issubclass call for protocol that is not runtime_checkable. Does not reject issubclass call for data protocol. Does not report unsafe overlap for runtime_checkable protocol. |
protocols_self | Pass | Pass | Pass | Partial Does not properly handle Self type within a protocol. |
protocols_subtyping | Pass | Pass | Pass | Partial Does not reject attempt to instantiate protocol class. Does not report some protocol type compatibility violations involving contravariance. |
protocols_variance | Pass | Partial Calculates incorrect variance when `self` or `cls` have explicit annotation. | Unsupported Does not detect incorrect TypeVar variance within generic protocols. | Unsupported Does not detect incorrect TypeVar variance within generic protocols. |
Callables | ||||
callables_annotation | Pass | Pass | Partial Does not evaluate correct type for `*args: int` parameter. Does not reject illegal form `Callable[[...], int]`. | Pass |
callables_kwargs | Pass | Pass | Unsupported Does not understand Unpack in the context of **kwargs annotation. | Unsupported Does not understand Unpack in the context of **kwargs annotation. |
callables_protocol | Pass | Pass | Partial Does not correctly handle callback protocol that declares attributes in all functions. Does not report type incompatibility for callback protocol with positional-only parameters. Incorrectly reports type compatibility error with callback that has *args and **kwargs. Does not report type incompatibility for callback missing a default argument for positional parameter. Does not report type incompatibility for callback missing a default argument for keyword parameter. | Unsupported Does not properly handle type compatibility checks with callback protocols. |
Overloads | ||||
overloads_basic | Pass | Pass | Partial Does not reject a function with a single @overload signature. | Partial Does not reject a function with a single @overload signature. Does not reject a function with @overload signature but no implementation. |
Dataclasses | ||||
dataclasses_descriptors | Partial Does not correctly evaluate type of descriptor access. | Pass | Partial Incorrectly generates error when calling constructor of dataclass with descriptor. | Unsupported Does not understand descriptor objects in dataclass. |
dataclasses_frozen | Pass | Pass | Partial Does not reject frozen dataclass inherited from non-frozen dataclass. Does not reject non-frozen dataclass inherited from frozen dataclass. | Unsupported Does not report assignment to field within frozen dataclass instance. Does not reject frozen dataclass inherited from non-frozen dataclass. Does not reject non-frozen dataclass inherited from frozen dataclass. |
dataclasses_hash | Partial Does not report when dataclass is not compatible with Hashable protocol. | Pass | Partial Does not report when dataclass is not compatible with Hashable protocol. | Partial Does not report when dataclass is not compatible with Hashable protocol. |
dataclasses_inheritance | Pass | Pass | Partial Does not reject ClassVar that is overridden by instance variable. Does not reject instance variable that is overridden by ClassVar. | Partial Does not reject ClassVar that is overridden by instance variable. Does not reject instance variable that is overridden by ClassVar. |
dataclasses_kwonly | Partial Incorrectly rejects kw_only field with default before positional field. | Pass | Pass | Partial Incorrectly reports error when kw_only field has default value. Incorrectly rejects kw_only field with default before positional field. |
dataclasses_order | Pass | Pass | Partial Does not report type incompatibility with comparison operator. | Partial Does not report type incompatibility with comparison operator. |
dataclasses_postinit | Pass | Pass | Unsupported Does not perform validation of `__post_init__` method. Does not reject access of `InitVar` from object. | Partial Does not validate `__post_init__` method. Reports incorrect error for incompatible `__post_init__` method override. |
dataclasses_slots | Partial Does not reject write to instance variable that is not defined in __slots__. | Pass | Partial Does not report error when `slots=True` is used with `__slots__` definition. Does not reject write to instance variable that is not defined in __slots__. Does not reject access to `__slots__` from dataclass instance when `slots=False`. | Partial Does not report error when `slots=True` is used with `__slots__` definition. Does not reject write to instance variable that is not defined in __slots__. Incorrectly reports error when accessing `__slots__` when `slots=True`. |
dataclasses_transform_class | Pass | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_field | Partial Does not properly handle field constructor that has default value for `kw_only` or `init` parameter. | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_func | Partial Does not handle `kw_only=False` override when `kw_only_default=True`. Does not report error when `order=False` and comparison operators are used. | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_transform_meta | Pass | Pass | Unsupported Does not understand @dataclass_transform. | Unsupported Does not understand @dataclass_transform. |
dataclasses_usage | Pass | Pass | Partial Does not report error when field with no default follows field with default. Incorrectly reports error with InitVar that has default value. | Pass |
Typed dictionaries | ||||
typeddicts_alt_syntax | Pass* Does not support keyword-argument form of alternative syntax (deprecated in 3.11). | Pass | Partial Does not report when name of TypedDict doesn't match assigned identifier name. Does not support keyword-argument form of alternative syntax (deprecated in 3.11). | Partial Does not reject use of variable as second argument to `TypedDict` call. Does not report when name of TypedDict doesn't match assigned identifier name. Does not support keyword-argument form of alternative syntax (deprecated in 3.11). |
typeddicts_class_syntax | Pass | Pass | Partial Does not reject methods within TypedDict class. Does not report when metaclass is provided. Does not report when other keyword argument is provided. Does not support generic TypedDict class. | Partial Does not reject methods within TypedDict class. Does not report when metaclass is provided. Does not report when other keyword argument is provided. |
typeddicts_final | Pass | Pass | Partial Does not handle value with literal type as index to TypedDict object. | Pass |
typeddicts_inheritance | Pass | Pass | Partial Does not reject TypedDict class that inherits from non-TypedDict class. | Pass |
typeddicts_operations | Pass | Pass | Pass | Partial Does not report type violation with TypedDict value assignment. Does not report reference to unknown key in TypedDict. Does not reject `clear` method on TypedDict with required keys. Does not reject delete operation for required key in TypedDict. |
typeddicts_required | Partial Does not support nesting of `Annotated` and `Required` or `NotRequired`. | Pass | Partial Does not reject use of `Required` in function parameter annotation. Does not reject nested use of `Required` in type annotation. Does not support recursive TypedDict definitions. | Partial Does not reject use of `Required` in non-TypedDict class. Does not reject use of `Required` in function parameter annotation. Does not reject nested use of `Required` in type annotation. |
typeddicts_type_consistency | Pass | Pass | Partial Does not reject assignment of TypedDict with missing key. Does not return non-Optional value from `get` method for required key. Does not properly handle nested TypedDicts. | Partial Does not report some type violations for TypedDict type compatibility. Incorrectly reports type violation in cases where there is none. Does not report type incompatibility between TypedDict and `dict[str, Any]`. |
typeddicts_usage | Pass | Pass | Partial Does not report errant use of TypedDict in `isinstance` call. Does not reject use of TypedDict as TypeVar bound. | Partial Does not report errant use of TypedDict in `isinstance` call. Does not reject use of TypedDict as TypeVar bound. |
Type narrowing | ||||
narrowing_typeguard | Pass | Pass | Partial Does not support `tuple` in `assert_type` call. Does not reject TypeGuard method with too few parameters. | Partial Does not reject TypeGuard method with too few parameters. |
Type checker directives | ||||
directives_assert_type | Pass | Pass | Unsupported Does not understand "assert_type". | Pass |
directives_cast | Pass | Pass | Pass | Partial Does not reject a call to "cast" with additional arguments. |
directives_no_type_check | Partial Does not honor `@no_type_check` class decorator. | Unsupported Intentionally does not honor @no_type_check decorator. | Unsupported Does not honor @no_type_check decorator. | Unsupported Does not honor @no_type_check decorator. |
directives_reveal_type | Pass | Pass | Unsupported Does not understand reveal_type call. | Partial Does not reject call to reveal_type with zero arguments. Does not reject call to reveal_type with too many arguments. |
directives_type_checking | Pass | Pass | Pass | Pass |
directives_type_ignore | Partial Does not honor "# type: ignore" comment if comment includes additional text. | Pass | Pass | Partial Does not honor "# type: ignore" comment if comment includes additional text. |
directives_type_ignore_file1 | Pass | Pass | Unsupported Does not support file-level `#type: ignore` comment. | Pass |
directives_type_ignore_file2 | Pass | Pass | Pass | Partial Does not ignore `# type: ignore` if it occurs after docstrings in the file. |
directives_version_platform | Pass* Does not understand three-element form of sys.version checks. Does not understand os.name checks. | Pass | Partial Does not support sys.platform checks. Does not support os.name checks. | Pass* Does not understand three-element form of sys.version checks. Does not understand os.name checks. |