diff --git a/mypy/semanal.py b/mypy/semanal.py index febb9590887e..63173daeb058 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -263,6 +263,7 @@ TYPE_CHECK_ONLY_NAMES, TYPE_VAR_LIKE_NAMES, TYPED_NAMEDTUPLE_NAMES, + UNPACK_TYPE_NAMES, AnyType, CallableType, FunctionLike, @@ -2281,7 +2282,7 @@ def analyze_unbound_tvar(self, t: Type) -> tuple[str, TypeVarLikeExpr] | None: return self.analyze_unbound_tvar_impl(t.type, is_unpacked=True) if isinstance(t, UnboundType): sym = self.lookup_qualified(t.name, t) - if sym and sym.fullname in ("typing.Unpack", "typing_extensions.Unpack"): + if sym and sym.fullname in UNPACK_TYPE_NAMES: inner_t = t.args[0] if isinstance(inner_t, UnboundType): return self.analyze_unbound_tvar_impl(inner_t, is_unpacked=True) @@ -4166,7 +4167,7 @@ def analyze_type_alias_type_params( base, code=codes.TYPE_VAR, ) - if sym and sym.fullname in ("typing.Unpack", "typing_extensions.Unpack"): + if sym and sym.fullname in UNPACK_TYPE_NAMES: self.note( "Don't Unpack type variables in type_params", base, code=codes.TYPE_VAR ) diff --git a/mypy/stubgen.py b/mypy/stubgen.py index 86f9a108f1d6..60460ee1e330 100755 --- a/mypy/stubgen.py +++ b/mypy/stubgen.py @@ -145,6 +145,7 @@ DATACLASS_TRANSFORM_NAMES, OVERLOAD_NAMES, TPDICT_NAMES, + TYPE_VAR_LIKE_NAMES, TYPED_NAMEDTUPLE_NAMES, AnyType, CallableType, @@ -1090,14 +1091,7 @@ def is_alias_expression(self, expr: Expression, top_level: bool = True) -> bool: or module alias. """ # Assignment of TypeVar(...) and other typevar-likes are passed through - if isinstance(expr, CallExpr) and self.get_fullname(expr.callee) in ( - "typing.TypeVar", - "typing_extensions.TypeVar", - "typing.ParamSpec", - "typing_extensions.ParamSpec", - "typing.TypeVarTuple", - "typing_extensions.TypeVarTuple", - ): + if isinstance(expr, CallExpr) and self.get_fullname(expr.callee) in TYPE_VAR_LIKE_NAMES: return True elif isinstance(expr, EllipsisExpr): return not top_level diff --git a/mypy/typeanal.py b/mypy/typeanal.py index 008e3c2477a1..3e463b692976 100644 --- a/mypy/typeanal.py +++ b/mypy/typeanal.py @@ -62,10 +62,12 @@ from mypy.types import ( ANNOTATED_TYPE_NAMES, ANY_STRATEGY, + CONCATENATE_TYPE_NAMES, FINAL_TYPE_NAMES, LITERAL_TYPE_NAMES, NEVER_NAMES, TYPE_ALIAS_NAMES, + UNPACK_TYPE_NAMES, AnyType, BoolTypeQuery, CallableArgument, @@ -525,7 +527,7 @@ def visit_unbound_type_nonoptional(self, t: UnboundType, defining_literal: bool) elif node.fullname in TYPE_ALIAS_NAMES: return AnyType(TypeOfAny.special_form) # Concatenate is an operator, no need for a proper type - elif node.fullname in ("typing_extensions.Concatenate", "typing.Concatenate"): + elif node.fullname in CONCATENATE_TYPE_NAMES: # We check the return type further up the stack for valid use locations return self.apply_concatenate_operator(t) else: @@ -779,7 +781,7 @@ def try_analyze_special_unbound_type(self, t: UnboundType, fullname: str) -> Typ ): # In most contexts, TypeGuard[...] acts as an alias for bool (ignoring its args) return self.named_type("builtins.bool") - elif fullname in ("typing.Unpack", "typing_extensions.Unpack"): + elif fullname in UNPACK_TYPE_NAMES: if len(t.args) != 1: self.fail("Unpack[...] requires exactly one type argument", t) return AnyType(TypeOfAny.from_error) @@ -1501,7 +1503,7 @@ def analyze_callable_args_for_concatenate( return None if sym.node is None: return None - if sym.node.fullname not in ("typing_extensions.Concatenate", "typing.Concatenate"): + if sym.node.fullname not in CONCATENATE_TYPE_NAMES: return None tvar_def = self.anal_type(callable_args, allow_param_spec=True) @@ -1650,7 +1652,7 @@ def analyze_callable_args( return None elif ( isinstance(arg, UnboundType) - and self.refers_to_full_names(arg, ("typing_extensions.Unpack", "typing.Unpack")) + and self.refers_to_full_names(arg, UNPACK_TYPE_NAMES) or isinstance(arg, UnpackType) ): if seen_unpack: diff --git a/mypy/types.py b/mypy/types.py index f3745695889f..427f40907269 100644 --- a/mypy/types.py +++ b/mypy/types.py @@ -130,6 +130,12 @@ # Supported Annotated type names. ANNOTATED_TYPE_NAMES: Final = ("typing.Annotated", "typing_extensions.Annotated") +# Supported Concatenate type names. +CONCATENATE_TYPE_NAMES: Final = ("typing.Concatenate", "typing_extensions.Concatenate") + +# Supported Unpack type names. +UNPACK_TYPE_NAMES: Final = ("typing.Unpack", "typing_extensions.Unpack") + # Supported @deprecated type names DEPRECATED_TYPE_NAMES: Final = ("warnings.deprecated", "typing_extensions.deprecated")