Skip to content

non-pep695-type-alias (UP040)

Derived from the pyupgrade linter.

Fix is always available.

What it does

Checks for use of TypeAlias annotations and TypeAliasType assignments for declaring type aliases.

Why is this bad?

The type keyword was introduced in Python 3.12 by PEP 695 for defining type aliases. The type keyword is easier to read and provides cleaner support for generics.

Known problems

PEP 695 uses inferred variance for type parameters, instead of the covariant and contravariant keywords used by TypeParam variables. As such, rewriting a TypeParam variable to a type alias may change its variance.

Unlike TypeParam variables, PEP 695-style type aliases cannot be used at runtime. For example, calling isinstance on a type alias will throw a TypeError. As such, rewriting a TypeParam via the type keyword will cause issues for parameters that are used for such runtime checks.

Example

ListOfInt: TypeAlias = list[int]
PositiveInt = TypeAliasType("PositiveInt", Annotated[int, Gt(0)])

Use instead:

type ListOfInt = list[int]
type PositiveInt = Annotated[int, Gt(0)]