typing — Support for type hints¶
New in version 3.5.
Source code:Lib/typing.py
Note
The Python runtime does not enforce function and variable type annotations.They can be used by third party tools such as type checkers, IDEs, linters,etc.
This module provides runtime support for type hints. The most fundamentalsupport consists of the typesAny,Union,Callable,TypeVar, andGeneric. For a full specification, please seePEP 484. For a simplified introduction to type hints, seePEP 483.
The function below takes and returns a string and is annotated as follows:
defgreeting(name:str)->str:return'Hello '+name
In the functiongreeting, the argumentname is expected to be of typestr and the return typestr. Subtypes are accepted asarguments.
New features are frequently added to thetyping module.Thetyping_extensions packageprovides backports of these new features to older versions of Python.
Relevant PEPs¶
Since the initial introduction of type hints inPEP 484 andPEP 483, anumber of PEPs have modified and enhanced Python’s framework for typeannotations. These include:
- PEP 544: Protocols: Structural subtyping (static duck typing)
Introducing
Protocoland the@runtime_checkabledecorator
- PEP 585: Type Hinting Generics In Standard Collections
Introducing
types.GenericAliasand the ability to use standardlibrary classes asgeneric types
Type aliases¶
A type alias is defined by assigning the type to the alias. In this example,Vector andlist[float] will be treated as interchangeable synonyms:
Vector=list[float]defscale(scalar:float,vector:Vector)->Vector:return[scalar*numfornuminvector]# typechecks; a list of floats qualifies as a Vector.new_vector=scale(2.0,[1.0,-4.2,5.4])
Type aliases are useful for simplifying complex type signatures. For example:
fromcollections.abcimportSequenceConnectionOptions=dict[str,str]Address=tuple[str,int]Server=tuple[Address,ConnectionOptions]defbroadcast_message(message:str,servers:Sequence[Server])->None:...# The static type checker will treat the previous type signature as# being exactly equivalent to this one.defbroadcast_message(message:str,servers:Sequence[tuple[tuple[str,int],dict[str,str]]])->None:...
Note thatNone as a type hint is a special case and is replaced bytype(None).
NewType¶
Use theNewType() helper to create distinct types:
fromtypingimportNewTypeUserId=NewType('UserId',int)some_id=UserId(524313)
The static type checker will treat the new type as if it were a subclassof the original type. This is useful in helping catch logical errors:
defget_user_name(user_id:UserId)->str:...# typechecksuser_a=get_user_name(UserId(42351))# does not typecheck; an int is not a UserIduser_b=get_user_name(-1)
You may still perform allint operations on a variable of typeUserId,but the result will always be of typeint. This lets you pass in aUserId wherever anint might be expected, but will prevent you fromaccidentally creating aUserId in an invalid way:
# 'output' is of type 'int', not 'UserId'output=UserId(23413)+UserId(54341)
Note that these checks are enforced only by the static type checker. At runtime,the statementDerived=NewType('Derived',Base) will makeDerived acallable that immediately returns whatever parameter you pass it. That meansthe expressionDerived(some_value) does not create a new class or introduceany overhead beyond that of a regular function call.
More precisely, the expressionsome_valueisDerived(some_value) is alwaystrue at runtime.
This also means that it is not possible to create a subtype ofDerivedsince it is an identity function at runtime, not an actual type:
fromtypingimportNewTypeUserId=NewType('UserId',int)# Fails at runtime and does not typecheckclassAdminUserId(UserId):pass
However, it is possible to create aNewType() based on a ‘derived’NewType:
fromtypingimportNewTypeUserId=NewType('UserId',int)ProUserId=NewType('ProUserId',UserId)
and typechecking forProUserId will work as expected.
SeePEP 484 for more details.
Note
Recall that the use of a type alias declares two types to beequivalent toone another. DoingAlias=Original will make the static type checkertreatAlias as beingexactly equivalent toOriginal in all cases.This is useful when you want to simplify complex type signatures.
In contrast,NewType declares one type to be asubtype of another.DoingDerived=NewType('Derived',Original) will make the static typechecker treatDerived as asubclass ofOriginal, which means avalue of typeOriginal cannot be used in places where a value of typeDerived is expected. This is useful when you want to prevent logicerrors with minimal runtime cost.
New in version 3.5.2.
Callable¶
Frameworks expecting callback functions of specific signatures might betype hinted usingCallable[[Arg1Type,Arg2Type],ReturnType].
For example:
fromcollections.abcimportCallabledeffeeder(get_next_item:Callable[[],str])->None:# Bodydefasync_query(on_success:Callable[[int],None],on_error:Callable[[int,Exception],None])->None:# Bodyasyncdefon_update(value:str)->None:# Bodycallback:Callable[[str],Awaitable[None]]=on_update
It is possible to declare the return type of a callable without specifyingthe call signature by substituting a literal ellipsisfor the list of arguments in the type hint:Callable[...,ReturnType].
Generics¶
Since type information about objects kept in containers cannot be staticallyinferred in a generic way, abstract base classes have been extended to supportsubscription to denote expected types for container elements.
fromcollections.abcimportMapping,Sequencedefnotify_by_email(employees:Sequence[Employee],overrides:Mapping[str,str])->None:...
Generics can be parameterized by using a factory available in typingcalledTypeVar.
fromcollections.abcimportSequencefromtypingimportTypeVarT=TypeVar('T')# Declare type variabledeffirst(l:Sequence[T])->T:# Generic functionreturnl[0]
User-defined generic types¶
A user-defined class can be defined as a generic class.
fromtypingimportTypeVar,GenericfromloggingimportLoggerT=TypeVar('T')classLoggedVar(Generic[T]):def__init__(self,value:T,name:str,logger:Logger)->None:self.name=nameself.logger=loggerself.value=valuedefset(self,new:T)->None:self.log('Set '+repr(self.value))self.value=newdefget(self)->T:self.log('Get '+repr(self.value))returnself.valuedeflog(self,message:str)->None:self.logger.info('%s:%s',self.name,message)
Generic[T] as a base class defines that the classLoggedVar takes asingle type parameterT . This also makesT valid as a type within theclass body.
TheGeneric base class defines__class_getitem__() sothatLoggedVar[t] is valid as a type:
fromcollections.abcimportIterabledefzero_all_vars(vars:Iterable[LoggedVar[int]])->None:forvarinvars:var.set(0)
A generic type can have any number of type variables. All varieties ofTypeVar are permissible as parameters for a generic type:
fromtypingimportTypeVar,Generic,SequenceT=TypeVar('T',contravariant=True)B=TypeVar('B',bound=Sequence[bytes],covariant=True)S=TypeVar('S',int,str)classWeirdTrio(Generic[T,B,S]):...
Each type variable argument toGeneric must be distinct.This is thus invalid:
fromtypingimportTypeVar,Generic...T=TypeVar('T')classPair(Generic[T,T]):# INVALID...
You can use multiple inheritance withGeneric:
fromcollections.abcimportSizedfromtypingimportTypeVar,GenericT=TypeVar('T')classLinkedList(Sized,Generic[T]):...
When inheriting from generic classes, some type variables could be fixed:
fromcollections.abcimportMappingfromtypingimportTypeVarT=TypeVar('T')classMyDict(Mapping[str,T]):...
In this caseMyDict has a single parameter,T.
Using a generic class without specifying type parameters assumesAny for each position. In the following example,MyIterable isnot generic but implicitly inherits fromIterable[Any]:
fromcollections.abcimportIterableclassMyIterable(Iterable):# Same as Iterable[Any]
User defined generic type aliases are also supported. Examples:
fromcollections.abcimportIterablefromtypingimportTypeVar,UnionS=TypeVar('S')Response=Union[Iterable[S],int]# Return type here is same as Union[Iterable[str], int]defresponse(query:str)->Response[str]:...T=TypeVar('T',int,float,complex)Vec=Iterable[tuple[T,T]]definproduct(v:Vec[T])->T:# Same as Iterable[tuple[T, T]]returnsum(x*yforx,yinv)
Changed in version 3.7:Generic no longer has a custom metaclass.
A user-defined generic class can have ABCs as base classes without a metaclassconflict. Generic metaclasses are not supported. The outcome of parameterizinggenerics is cached, and most types in the typing module are hashable andcomparable for equality.
TheAny type¶
A special kind of type isAny. A static type checker will treatevery type as being compatible withAny andAny as beingcompatible with every type.
This means that it is possible to perform any operation or method call on avalue of typeAny and assign it to any variable:
fromtypingimportAnya:Any=Nonea=[]# OKa=2# OKs:str=''s=a# OKdeffoo(item:Any)->int:# Typechecks; 'item' could be any type,# and that type might have a 'bar' methoditem.bar()...
Notice that no typechecking is performed when assigning a value of typeAny to a more precise type. For example, the static type checker didnot report an error when assigninga tos even thoughs wasdeclared to be of typestr and receives anint value atruntime!
Furthermore, all functions without a return type or parameter types willimplicitly default to usingAny:
deflegacy_parser(text):...returndata# A static type checker will treat the above# as having the same signature as:deflegacy_parser(text:Any)->Any:...returndata
This behavior allowsAny to be used as anescape hatch when youneed to mix dynamically and statically typed code.
Contrast the behavior ofAny with the behavior ofobject.Similar toAny, every type is a subtype ofobject. However,unlikeAny, the reverse is not true:object isnot asubtype of every other type.
That means when the type of a value isobject, a type checker willreject almost all operations on it, and assigning it to a variable (or usingit as a return value) of a more specialized type is a type error. For example:
defhash_a(item:object)->int:# Fails; an object does not have a 'magic' method.item.magic()...defhash_b(item:Any)->int:# Typechecksitem.magic()...# Typechecks, since ints and strs are subclasses of objecthash_a(42)hash_a("foo")# Typechecks, since Any is compatible with all typeshash_b(42)hash_b("foo")
Useobject to indicate that a value could be any type in a typesafemanner. UseAny to indicate that a value is dynamically typed.
Nominal vs structural subtyping¶
InitiallyPEP 484 defined the Python static type system as usingnominal subtyping. This means that a classA is allowed wherea classB is expected if and only ifA is a subclass ofB.
This requirement previously also applied to abstract base classes, such asIterable. The problem with this approach is that a class hadto be explicitly marked to support them, which is unpythonic and unlikewhat one would normally do in idiomatic dynamically typed Python code.For example, this conforms toPEP 484:
fromcollections.abcimportSized,Iterable,IteratorclassBucket(Sized,Iterable[int]):...def__len__(self)->int:...def__iter__(self)->Iterator[int]:...
PEP 544 allows to solve this problem by allowing users to writethe above code without explicit base classes in the class definition,allowingBucket to be implicitly considered a subtype of bothSizedandIterable[int] by static type checkers. This is known asstructural subtyping (or static duck-typing):
fromcollections.abcimportIterator,IterableclassBucket:# Note: no base classes...def__len__(self)->int:...def__iter__(self)->Iterator[int]:...defcollect(items:Iterable[int])->int:...result=collect(Bucket())# Passes type check
Moreover, by subclassing a special classProtocol, a usercan define new custom protocols to fully enjoy structural subtyping(see examples below).
Module contents¶
The module defines the following classes, functions and decorators.
Note
This module defines several types that are subclasses of pre-existingstandard library classes which also extendGenericto support type variables inside[].These types became redundant in Python 3.9 when thecorresponding pre-existing classes were enhanced to support[].
The redundant types are deprecated as of Python 3.9 but nodeprecation warnings will be issued by the interpreter.It is expected that type checkers will flag the deprecated typeswhen the checked program targets Python 3.9 or newer.
The deprecated types will be removed from thetyping modulein the first Python version released 5 years after the release of Python 3.9.0.See details inPEP 585—Type Hinting Generics In Standard Collections.
Special typing primitives¶
Special types¶
These can be used as types in annotations and do not support[].
typing.Any¶Special type indicating an unconstrained type.
typing.NoReturn¶Special type indicating that a function never returns.For example:
fromtypingimportNoReturndefstop()->NoReturn:raiseRuntimeError('no way')
New in version 3.5.4.
New in version 3.6.2.
Special forms¶
These can be used as types in annotations using[], each having a unique syntax.
typing.Tuple¶Tuple type;
Tuple[X,Y]is the type of a tuple of two itemswith the first item of type X and the second of type Y. The type ofthe empty tuple can be written asTuple[()].Example:
Tuple[T1,T2]is a tuple of two elements correspondingto type variables T1 and T2.Tuple[int,float,str]is a tupleof an int, a float and a string.To specify a variable-length tuple of homogeneous type,use literal ellipsis, e.g.
Tuple[int,...]. A plainTupleis equivalent toTuple[Any,...], and in turn totuple.Deprecated since version 3.9:
builtins.tuplenow supports[]. SeePEP 585 andGeneric Alias Type.
typing.Union¶Union type;
Union[X,Y]means either X or Y.To define a union, use e.g.
Union[int,str]. Details:The arguments must be types and there must be at least one.
Unions of unions are flattened, e.g.:
Union[Union[int,str],float]==Union[int,str,float]
Unions of a single argument vanish, e.g.:
Union[int]==int# The constructor actually returns int
Redundant arguments are skipped, e.g.:
Union[int,str,int]==Union[int,str]
When comparing unions, the argument order is ignored, e.g.:
Union[int,str]==Union[str,int]
You cannot subclass or instantiate a union.
You cannot write
Union[X][Y].You can use
Optional[X]as a shorthand forUnion[X,None].
Changed in version 3.7:Don’t remove explicit subclasses from unions at runtime.
typing.Optional¶Optional type.
Optional[X]is equivalent toUnion[X,None].Note that this is not the same concept as an optional argument,which is one that has a default. An optional argument with adefault does not require the
Optionalqualifier on its typeannotation just because it is optional. For example:deffoo(arg:int=0)->None:...
On the other hand, if an explicit value of
Noneis allowed, theuse ofOptionalis appropriate, whether the argument is optionalor not. For example:deffoo(arg:Optional[int]=None)->None:...
typing.Callable¶Callable type;
Callable[[int],str]is a function of (int) -> str.The subscription syntax must always be used with exactly twovalues: the argument list and the return type. The argument listmust be a list of types or an ellipsis; the return type must bea single type.
There is no syntax to indicate optional or keyword arguments;such function types are rarely used as callback types.
Callable[...,ReturnType](literal ellipsis) can be used totype hint a callable taking any number of arguments and returningReturnType. A plainCallableis equivalent toCallable[...,Any], and in turn tocollections.abc.Callable.Deprecated since version 3.9:
collections.abc.Callablenow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.Type(Generic[CT_co])¶ A variable annotated with
Cmay accept a value of typeC. Incontrast, a variable annotated withType[C]may accept values that areclasses themselves – specifically, it will accept theclass object ofC. For example:a=3# Has type 'int'b=int# Has type 'Type[int]'c=type(a)# Also has type 'Type[int]'
Note that
Type[C]is covariant:classUser:...classBasicUser(User):...classProUser(User):...classTeamUser(User):...# Accepts User, BasicUser, ProUser, TeamUser, ...defmake_new_user(user_class:Type[User])->User:# ...returnuser_class()
The fact that
Type[C]is covariant implies that all subclasses ofCshould implement the same constructor signature and class methodsignatures asC. The type checker should flag violations of this,but should also allow constructor calls in subclasses that match theconstructor calls in the indicated base class. How the type checker isrequired to handle this particular case may change in future revisions ofPEP 484.The only legal parameters for
Typeare classes,Any,type variables, and unions of any of these types.For example:defnew_non_team_user(user_class:Type[Union[BasicUser,ProUser]]):...
Type[Any]is equivalent toTypewhich in turn is equivalenttotype, which is the root of Python’s metaclass hierarchy.New in version 3.5.2.
Deprecated since version 3.9:
builtins.typenow supports[]. SeePEP 585 andGeneric Alias Type.
typing.Literal¶A type that can be used to indicate to type checkers that thecorresponding variable or function parameter has a value equivalent tothe provided literal (or one of several literals). For example:
defvalidate_simple(data:Any)->Literal[True]:# always returns True...MODE=Literal['r','rb','w','wb']defopen_helper(file:str,mode:MODE)->str:...open_helper('/some/path','r')# Passes type checkopen_helper('/other/path','typo')# Error in type checker
Literal[...]cannot be subclassed. At runtime, an arbitrary valueis allowed as type argument toLiteral[...], but type checkers mayimpose restrictions. SeePEP 586 for more details about literal types.New in version 3.8.
typing.ClassVar¶Special type construct to mark class variables.
As introduced inPEP 526, a variable annotation wrapped in ClassVarindicates that a given attribute is intended to be used as a class variableand should not be set on instances of that class. Usage:
classStarship:stats:ClassVar[dict[str,int]]={}# class variabledamage:int=10# instance variable
ClassVaraccepts only types and cannot be further subscribed.ClassVaris not a class itself, and should notbe used withisinstance()orissubclass().ClassVardoes not change Python runtime behavior, butit can be used by third-party type checkers. For example, a type checkermight flag the following code as an error:enterprise_d=Starship(3000)enterprise_d.stats={}# Error, setting class variable on instanceStarship.stats={}# This is OK
New in version 3.5.3.
typing.Final¶A special typing construct to indicate to type checkers that a namecannot be re-assigned or overridden in a subclass. For example:
MAX_SIZE:Final=9000MAX_SIZE+=1# Error reported by type checkerclassConnection:TIMEOUT:Final[int]=10classFastConnector(Connection):TIMEOUT=1# Error reported by type checker
There is no runtime checking of these properties. SeePEP 591 formore details.
New in version 3.8.
typing.Annotated¶A type, introduced inPEP 593 (
Flexiblefunctionandvariableannotations), to decorate existing types with context-specific metadata(possibly multiple pieces of it, asAnnotatedis variadic).Specifically, a typeTcan be annotated with metadataxvia thetypehintAnnotated[T,x]. This metadata can be used for either staticanalysis or at runtime. If a library (or tool) encounters a typehintAnnotated[T,x]and has no special logic for metadatax, itshould ignore it and simply treat the type asT. Unlike theno_type_checkfunctionality that currently exists in thetypingmodule which completely disables typechecking annotations on a functionor a class, theAnnotatedtype allows for both static typecheckingofT(which can safely ignorex)together with runtime access toxwithin a specific application.Ultimately, the responsibility of how to interpret the annotations (ifat all) is the responsibility of the tool or library encountering the
Annotatedtype. A tool or library encountering anAnnotatedtypecan scan through the annotations to determine if they are of interest(e.g., usingisinstance()).When a tool or a library does not support annotations or encounters anunknown annotation it should just ignore it and treat annotated type asthe underlying type.
It’s up to the tool consuming the annotations to decide whether theclient is allowed to have several annotations on one type and how tomerge those annotations.
Since the
Annotatedtype allows you to put several annotations ofthe same (or different) type(s) on any node, the tools or librariesconsuming those annotations are in charge of dealing with potentialduplicates. For example, if you are doing value range analysis you mightallow this:T1=Annotated[int,ValueRange(-10,5)]T2=Annotated[T1,ValueRange(-20,3)]
Passing
include_extras=Truetoget_type_hints()lets oneaccess the extra annotations at runtime.The details of the syntax:
The first argument to
Annotatedmust be a valid typeMultiple type annotations are supported (
Annotatedsupports variadicarguments):Annotated[int,ValueRange(3,10),ctype("char")]
Annotatedmust be called with at least two arguments (Annotated[int]is not valid)The order of the annotations is preserved and matters for equalitychecks:
Annotated[int,ValueRange(3,10),ctype("char")]!=Annotated[int,ctype("char"),ValueRange(3,10)]
Nested
Annotatedtypes are flattened, with metadata orderedstarting with the innermost annotation:Annotated[Annotated[int,ValueRange(3,10)],ctype("char")]==Annotated[int,ValueRange(3,10),ctype("char")]
Duplicated annotations are not removed:
Annotated[int,ValueRange(3,10)]!=Annotated[int,ValueRange(3,10),ValueRange(3,10)]
Annotatedcan be used with nested and generic aliases:T=TypeVar('T')Vec=Annotated[list[tuple[T,T]],MaxLen(10)]V=Vec[int]V==Annotated[list[tuple[int,int]],MaxLen(10)]
New in version 3.9.
Building generic types¶
These are not used in annotations. They are building blocks for creating generic types.
- class
typing.Generic¶ Abstract base class for generic types.
A generic type is typically declared by inheriting from aninstantiation of this class with one or more type variables.For example, a generic mapping type might be defined as:
classMapping(Generic[KT,VT]):def__getitem__(self,key:KT)->VT:...# Etc.
This class can then be used as follows:
X=TypeVar('X')Y=TypeVar('Y')deflookup_name(mapping:Mapping[X,Y],key:X,default:Y)->Y:try:returnmapping[key]exceptKeyError:returndefault
- class
typing.TypeVar¶ Type variable.
Usage:
T=TypeVar('T')# Can be anythingS=TypeVar('S',bound=str)# Can be any subtype of strA=TypeVar('A',str,bytes)# Must be exactly str or bytes
Type variables exist primarily for the benefit of static typecheckers. They serve as the parameters for generic types as wellas for generic function definitions. See
Genericfor moreinformation on generic types. Generic functions work as follows:defrepeat(x:T,n:int)->Sequence[T]:"""Return a list containing n references to x."""return[x]*ndefprint_capitalized(x:S)->S:"""Print x capitalized, and return x."""print(x.capitalize())returnxdefconcatenate(x:A,y:A)->A:"""Add two strings or bytes objects together."""returnx+y
Note that type variables can bebound,constrained, or neither, butcannot be both boundand constrained.
Constrained type variables and bound type variables have differentsemantics in several important ways. Using aconstrained type variablemeans that the
TypeVarcan only ever be solved as being exactly one ofthe constraints given:a=concatenate('one','two')# Ok, variable 'a' has type 'str'b=concatenate(StringSubclass('one'),StringSubclass('two'))# Inferred type of variable 'b' is 'str',# despite 'StringSubclass' being passed inc=concatenate('one',b'two')# error: type variable 'A' can be either 'str' or 'bytes' in a function call, but not both
Using abound type variable, however, means that the
TypeVarwill besolved using the most specific type possible:print_capitalized('a string')# Ok, output has type 'str'classStringSubclass(str):passprint_capitalized(StringSubclass('another string'))# Ok, output has type 'StringSubclass'print_capitalized(45)# error: int is not a subtype of str
Type variables can be bound to concrete types, abstract types (ABCs orprotocols), and even unions of types:
U=TypeVar('U',bound=str|bytes)# Can be any subtype of the union str|bytesV=TypeVar('V',bound=SupportsAbs)# Can be anything with an __abs__ method
Bound type variables are particularly useful for annotating
classmethodsthat serve as alternative constructors.In the following example (©Raymond Hettinger), thetype variableCis bound to theCircleclass through the use of aforward reference. Using this type variable to annotate thewith_circumferenceclassmethod, rather than hardcoding the return typeasCircle, means that a type checker can correctly infer the returntype even if the method is called on a subclass:importmathC=TypeVar('C',bound='Circle')classCircle:"""An abstract circle"""def__init__(self,radius:float)->None:self.radius=radius# Use a type variable to show that the return type# will always be an instance of whatever ``cls`` is@classmethoddefwith_circumference(cls:type[C],circumference:float)->C:"""Create a circle with the specified circumference"""radius=circumference/(math.pi*2)returncls(radius)classTire(Circle):"""A specialised circle (made out of rubber)"""MATERIAL='rubber'c=Circle.with_circumference(3)# Ok, variable 'c' has type 'Circle't=Tire.with_circumference(4)# Ok, variable 't' has type 'Tire' (not 'Circle')
At runtime,
isinstance(x,T)will raiseTypeError. In general,isinstance()andissubclass()should not be used with types.Type variables may be marked covariant or contravariant by passing
covariant=Trueorcontravariant=True. SeePEP 484 for moredetails. By default, type variables are invariant.
typing.AnyStr¶AnyStris aconstrainedtypevariabledefined asAnyStr=TypeVar('AnyStr',str,bytes).It is meant to be used for functions that may accept any kind of stringwithout allowing different kinds of strings to mix. For example:
defconcat(a:AnyStr,b:AnyStr)->AnyStr:returna+bconcat(u"foo",u"bar")# Ok, output has type 'unicode'concat(b"foo",b"bar")# Ok, output has type 'bytes'concat(u"foo",b"bar")# Error, cannot mix unicode and bytes
- class
typing.Protocol(Generic)¶ Base class for protocol classes. Protocol classes are defined like this:
classProto(Protocol):defmeth(self)->int:...
Such classes are primarily used with static type checkers that recognizestructural subtyping (static duck-typing), for example:
classC:defmeth(self)->int:return0deffunc(x:Proto)->int:returnx.meth()func(C())# Passes static type check
SeePEP 544 for details. Protocol classes decorated with
runtime_checkable()(described later) act as simple-minded runtimeprotocols that check only the presence of given attributes, ignoring theirtype signatures.Protocol classes can be generic, for example:
classGenProto(Protocol[T]):defmeth(self)->T:...
New in version 3.8.
@typing.runtime_checkable¶Mark a protocol class as a runtime protocol.
Such a protocol can be used with
isinstance()andissubclass().This raisesTypeErrorwhen applied to a non-protocol class. Thisallows a simple-minded structural check, very similar to “one trick ponies”incollections.abcsuch asIterable. For example:@runtime_checkableclassClosable(Protocol):defclose(self):...assertisinstance(open('/some/file'),Closable)
Note
runtime_checkable()will check only the presence of the required methods,not their type signatures! For example,builtins.compleximplements__float__(), therefore it passes anissubclass()checkagainstSupportsFloat. However, thecomplex.__float__methodexists only to raise aTypeErrorwith a more informative message.New in version 3.8.
Other special directives¶
These are not used in annotations. They are building blocks for declaring types.
- class
typing.NamedTuple¶ Typed version of
collections.namedtuple().Usage:
classEmployee(NamedTuple):name:strid:int
This is equivalent to:
Employee=collections.namedtuple('Employee',['name','id'])
To give a field a default value, you can assign to it in the class body:
classEmployee(NamedTuple):name:strid:int=3employee=Employee('Guido')assertemployee.id==3
Fields with a default value must come after any fields without a default.
The resulting class has an extra attribute
__annotations__giving adict that maps the field names to the field types. (The field names are inthe_fieldsattribute and the default values are in the_field_defaultsattribute, both of which are part of thenamedtuple()API.)NamedTuplesubclasses can also have docstrings and methods:classEmployee(NamedTuple):"""Represents an employee."""name:strid:int=3def__repr__(self)->str:returnf'<Employee{self.name}, id={self.id}>'
Backward-compatible usage:
Employee=NamedTuple('Employee',[('name',str),('id',int)])
Changed in version 3.6:Added support forPEP 526 variable annotation syntax.
Changed in version 3.6.1:Added support for default values, methods, and docstrings.
Changed in version 3.8:The
_field_typesand__annotations__attributes arenow regular dictionaries instead of instances ofOrderedDict.Changed in version 3.9:Removed the
_field_typesattribute in favor of the morestandard__annotations__attribute which has the same information.
typing.NewType(name,tp)¶A helper function to indicate a distinct type to a typechecker,seeNewType. At runtime it returns a function that returnsits argument. Usage:
UserId=NewType('UserId',int)first_user=UserId(1)
New in version 3.5.2.
- class
typing.TypedDict(dict)¶ Special construct to add type hints to a dictionary.At runtime it is a plain
dict.TypedDictdeclares a dictionary type that expects all of itsinstances to have a certain set of keys, where each key isassociated with a value of a consistent type. This expectationis not checked at runtime but is only enforced by type checkers.Usage:classPoint2D(TypedDict):x:inty:intlabel:stra:Point2D={'x':1,'y':2,'label':'good'}# OKb:Point2D={'z':3,'label':'bad'}# Fails type checkassertPoint2D(x=1,y=2,label='first')==dict(x=1,y=2,label='first')
To allow using this feature with older versions of Python that do notsupportPEP 526,
TypedDictsupports two additional equivalentsyntactic forms:Using a literal
dictas the second argument:Point2D=TypedDict('Point2D',{'x':int,'y':int,'label':str})
Using keyword arguments:
Point2D=TypedDict('Point2D',x=int,y=int,label=str)
The functional syntax should also be used when any of the keys are not valididentifiers, for example because they are keywords or contain hyphens.Example:
# raises SyntaxErrorclassPoint2D(TypedDict):in:int# 'in' is a keywordx-y:int# name with hyphens# OK, functional syntaxPoint2D=TypedDict('Point2D',{'in':int,'x-y':int})
By default, all keys must be present in a
TypedDict. It is possible tooverride this by specifying totality.Usage:classPoint2D(TypedDict,total=False):x:inty:int# Alternative syntaxPoint2D=TypedDict('Point2D',{'x':int,'y':int},total=False)
This means that a
Point2DTypedDictcan have any of the keysomitted. A type checker is only expected to support a literalFalseorTrueas the value of thetotalargument.Trueis the default,and makes all items defined in the class body required.It is possible for a
TypedDicttype to inherit from one or more otherTypedDicttypesusing the class-based syntax.Usage:classPoint3D(Point2D):z:int
Point3Dhas three items:x,yandz. It is equivalent to thisdefinition:classPoint3D(TypedDict):x:inty:intz:int
A
TypedDictcannot inherit from a non-TypedDictclass,notably includingGeneric. For example:classX(TypedDict):x:intclassY(TypedDict):y:intclassZ(object):pass# A non-TypedDict classclassXY(X,Y):pass# OKclassXZ(X,Z):pass# raises TypeErrorT=TypeVar('T')classXT(X,Generic[T]):pass# raises TypeError
A
TypedDictcan be introspected via__annotations__,__total__,__required_keys__, and__optional_keys__.__total__¶Point2D.__total__gives the value of thetotalargument.Example:>>>fromtypingimportTypedDict>>>classPoint2D(TypedDict):pass>>>Point2D.__total__True>>>classPoint2D(TypedDict,total=False):pass>>>Point2D.__total__False>>>classPoint3D(Point2D):pass>>>Point3D.__total__True
__required_keys__¶
__optional_keys__¶Point2D.__required_keys__andPoint2D.__optional_keys__returnfrozensetobjects containing required and non-required keys, respectively.Currently the only way to declare both required and non-required keys in thesameTypedDictis mixed inheritance, declaring aTypedDictwith one valuefor thetotalargument and then inheriting it from anotherTypedDictwitha different value fortotal.Usage:>>>classPoint2D(TypedDict,total=False):...x:int...y:int...>>>classPoint3D(Point2D):...z:int...>>>Point3D.__required_keys__==frozenset({'z'})True>>>Point3D.__optional_keys__==frozenset({'x','y'})True
SeePEP 589 for more examples and detailed rules of using
TypedDict.New in version 3.8.
Generic concrete collections¶
Corresponding to built-in types¶
- class
typing.Dict(dict, MutableMapping[KT, VT])¶ A generic version of
dict.Useful for annotating return types. To annotate arguments it is preferredto use an abstract collection type such asMapping.This type can be used as follows:
defcount_words(text:str)->Dict[str,int]:...
Deprecated since version 3.9:
builtins.dictnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.List(list, MutableSequence[T])¶ Generic version of
list.Useful for annotating return types. To annotate arguments it is preferredto use an abstract collection type such asSequenceorIterable.This type may be used as follows:
T=TypeVar('T',int,float)defvec2(x:T,y:T)->List[T]:return[x,y]defkeep_positives(vector:Sequence[T])->List[T]:return[itemforiteminvectorifitem>0]
Deprecated since version 3.9:
builtins.listnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.Set(set, MutableSet[T])¶ A generic version of
builtins.set.Useful for annotating return types. To annotate arguments it is preferredto use an abstract collection type such asAbstractSet.Deprecated since version 3.9:
builtins.setnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.FrozenSet(frozenset, AbstractSet[T_co])¶ A generic version of
builtins.frozenset.Deprecated since version 3.9:
builtins.frozensetnow supports[]. SeePEP 585 andGeneric Alias Type.
Note
Tuple is a special form.
Corresponding to types incollections¶
- class
typing.DefaultDict(collections.defaultdict, MutableMapping[KT, VT])¶ A generic version of
collections.defaultdict.New in version 3.5.2.
Deprecated since version 3.9:
collections.defaultdictnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.OrderedDict(collections.OrderedDict, MutableMapping[KT, VT])¶ A generic version of
collections.OrderedDict.New in version 3.7.2.
Deprecated since version 3.9:
collections.OrderedDictnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.ChainMap(collections.ChainMap, MutableMapping[KT, VT])¶ A generic version of
collections.ChainMap.New in version 3.5.4.
New in version 3.6.1.
Deprecated since version 3.9:
collections.ChainMapnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.Counter(collections.Counter, Dict[T, int])¶ A generic version of
collections.Counter.New in version 3.5.4.
New in version 3.6.1.
Deprecated since version 3.9:
collections.Counternow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.Deque(deque, MutableSequence[T])¶ A generic version of
collections.deque.New in version 3.5.4.
New in version 3.6.1.
Deprecated since version 3.9:
collections.dequenow supports[]. SeePEP 585 andGeneric Alias Type.
Other concrete types¶
- class
typing.IO¶ - class
typing.TextIO¶ - class
typing.BinaryIO¶ Generic type
IO[AnyStr]and its subclassesTextIO(IO[str])andBinaryIO(IO[bytes])represent the types of I/O streams such as returned byopen().Deprecated since version 3.8, will be removed in version 3.12:These types are also in the
typing.ionamespace, which wasnever supported by type checkers and will be removed.
- class
typing.Pattern¶ - class
typing.Match¶ These type aliasescorrespond to the return types from
re.compile()andre.match(). These types (and the corresponding functions)are generic inAnyStrand can be made specific by writingPattern[str],Pattern[bytes],Match[str], orMatch[bytes].Deprecated since version 3.8, will be removed in version 3.12:These types are also in the
typing.renamespace, which wasnever supported by type checkers and will be removed.Deprecated since version 3.9:Classes
PatternandMatchfromrenow support[].SeePEP 585 andGeneric Alias Type.
- class
typing.Text¶ Textis an alias forstr. It is provided to supply a forwardcompatible path for Python 2 code: in Python 2,Textis an alias forunicode.Use
Textto indicate that a value must contain a unicode string ina manner that is compatible with both Python 2 and Python 3:defadd_unicode_checkmark(text:Text)->Text:returntext+u'\u2713'
New in version 3.5.2.
Abstract Base Classes¶
Corresponding to collections incollections.abc¶
- class
typing.AbstractSet(Sized, Collection[T_co])¶ A generic version of
collections.abc.Set.Deprecated since version 3.9:
collections.abc.Setnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.ByteString(Sequence[int])¶ A generic version of
collections.abc.ByteString.This type represents the types
bytes,bytearray,andmemoryviewof byte sequences.As a shorthand for this type,
bytescan be used toannotate arguments of any of the types mentioned above.Deprecated since version 3.9:
collections.abc.ByteStringnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Collection(Sized, Iterable[T_co], Container[T_co])¶ A generic version of
collections.abc.CollectionNew in version 3.6.0.
Deprecated since version 3.9:
collections.abc.Collectionnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Container(Generic[T_co])¶ A generic version of
collections.abc.Container.Deprecated since version 3.9:
collections.abc.Containernow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.ItemsView(MappingView, Generic[KT_co, VT_co])¶ A generic version of
collections.abc.ItemsView.Deprecated since version 3.9:
collections.abc.ItemsViewnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.KeysView(MappingView[KT_co], AbstractSet[KT_co])¶ A generic version of
collections.abc.KeysView.Deprecated since version 3.9:
collections.abc.KeysViewnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Mapping(Sized, Collection[KT], Generic[VT_co])¶ A generic version of
collections.abc.Mapping.This type can be used as follows:defget_position_in_index(word_list:Mapping[str,int],word:str)->int:returnword_list[word]
Deprecated since version 3.9:
collections.abc.Mappingnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.MappingView(Sized, Iterable[T_co])¶ A generic version of
collections.abc.MappingView.Deprecated since version 3.9:
collections.abc.MappingViewnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.MutableMapping(Mapping[KT, VT])¶ A generic version of
collections.abc.MutableMapping.Deprecated since version 3.9:
collections.abc.MutableMappingnow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.MutableSequence(Sequence[T])¶ A generic version of
collections.abc.MutableSequence.Deprecated since version 3.9:
collections.abc.MutableSequencenow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.MutableSet(AbstractSet[T])¶ A generic version of
collections.abc.MutableSet.Deprecated since version 3.9:
collections.abc.MutableSetnow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Sequence(Reversible[T_co], Collection[T_co])¶ A generic version of
collections.abc.Sequence.Deprecated since version 3.9:
collections.abc.Sequencenow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.ValuesView(MappingView[VT_co])¶ A generic version of
collections.abc.ValuesView.Deprecated since version 3.9:
collections.abc.ValuesViewnow supports[]. SeePEP 585andGeneric Alias Type.
Corresponding to other types incollections.abc¶
- class
typing.Iterable(Generic[T_co])¶ A generic version of
collections.abc.Iterable.Deprecated since version 3.9:
collections.abc.Iterablenow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Iterator(Iterable[T_co])¶ A generic version of
collections.abc.Iterator.Deprecated since version 3.9:
collections.abc.Iteratornow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Generator(Iterator[T_co], Generic[T_co, T_contra, V_co])¶ A generator can be annotated by the generic type
Generator[YieldType,SendType,ReturnType]. For example:defecho_round()->Generator[int,float,str]:sent=yield0whilesent>=0:sent=yieldround(sent)return'Done'
Note that unlike many other generics in the typing module, the
SendTypeofGeneratorbehaves contravariantly, not covariantly orinvariantly.If your generator will only yield values, set the
SendTypeandReturnTypetoNone:definfinite_stream(start:int)->Generator[int,None,None]:whileTrue:yieldstartstart+=1
Alternatively, annotate your generator as having a return type ofeither
Iterable[YieldType]orIterator[YieldType]:definfinite_stream(start:int)->Iterator[int]:whileTrue:yieldstartstart+=1
Deprecated since version 3.9:
collections.abc.Generatornow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Hashable¶ An alias to
collections.abc.Hashable.
- class
typing.Reversible(Iterable[T_co])¶ A generic version of
collections.abc.Reversible.Deprecated since version 3.9:
collections.abc.Reversiblenow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Sized¶ An alias to
collections.abc.Sized.
Asynchronous programming¶
- class
typing.Coroutine(Awaitable[V_co], Generic[T_co, T_contra, V_co])¶ A generic version of
collections.abc.Coroutine.The variance and order of type variablescorrespond to those ofGenerator, for example:fromcollections.abcimportCoroutinec:Coroutine[list[str],str,int]# Some coroutine defined elsewherex=c.send('hi')# Inferred type of 'x' is list[str]asyncdefbar()->None:y=awaitc# Inferred type of 'y' is int
New in version 3.5.3.
Deprecated since version 3.9:
collections.abc.Coroutinenow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra])¶ An async generator can be annotated by the generic type
AsyncGenerator[YieldType,SendType]. For example:asyncdefecho_round()->AsyncGenerator[int,float]:sent=yield0whilesent>=0.0:rounded=awaitround(sent)sent=yieldrounded
Unlike normal generators, async generators cannot return a value, so thereis no
ReturnTypetype parameter. As withGenerator, theSendTypebehaves contravariantly.If your generator will only yield values, set the
SendTypetoNone:asyncdefinfinite_stream(start:int)->AsyncGenerator[int,None]:whileTrue:yieldstartstart=awaitincrement(start)
Alternatively, annotate your generator as having a return type ofeither
AsyncIterable[YieldType]orAsyncIterator[YieldType]:asyncdefinfinite_stream(start:int)->AsyncIterator[int]:whileTrue:yieldstartstart=awaitincrement(start)
New in version 3.6.1.
Deprecated since version 3.9:
collections.abc.AsyncGeneratornow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.AsyncIterable(Generic[T_co])¶ A generic version of
collections.abc.AsyncIterable.New in version 3.5.2.
Deprecated since version 3.9:
collections.abc.AsyncIterablenow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.AsyncIterator(AsyncIterable[T_co])¶ A generic version of
collections.abc.AsyncIterator.New in version 3.5.2.
Deprecated since version 3.9:
collections.abc.AsyncIteratornow supports[]. SeePEP 585andGeneric Alias Type.
- class
typing.Awaitable(Generic[T_co])¶ A generic version of
collections.abc.Awaitable.New in version 3.5.2.
Deprecated since version 3.9:
collections.abc.Awaitablenow supports[]. SeePEP 585andGeneric Alias Type.
Context manager types¶
- class
typing.ContextManager(Generic[T_co])¶ A generic version of
contextlib.AbstractContextManager.New in version 3.5.4.
New in version 3.6.0.
Deprecated since version 3.9:
contextlib.AbstractContextManagernow supports[]. SeePEP 585 andGeneric Alias Type.
- class
typing.AsyncContextManager(Generic[T_co])¶ A generic version of
contextlib.AbstractAsyncContextManager.New in version 3.5.4.
New in version 3.6.2.
Deprecated since version 3.9:
contextlib.AbstractAsyncContextManagernow supports[]. SeePEP 585 andGeneric Alias Type.
Protocols¶
These protocols are decorated withruntime_checkable().
- class
typing.SupportsAbs¶ An ABC with one abstract method
__abs__that is covariantin its return type.
- class
typing.SupportsBytes¶ An ABC with one abstract method
__bytes__.
- class
typing.SupportsComplex¶ An ABC with one abstract method
__complex__.
- class
typing.SupportsFloat¶ An ABC with one abstract method
__float__.
- class
typing.SupportsIndex¶ An ABC with one abstract method
__index__.New in version 3.8.
- class
typing.SupportsInt¶ An ABC with one abstract method
__int__.
- class
typing.SupportsRound¶ An ABC with one abstract method
__round__that is covariant in its return type.
Functions and decorators¶
typing.cast(typ,val)¶Cast a value to a type.
This returns the value unchanged. To the type checker thissignals that the return value has the designated type, but atruntime we intentionally don’t check anything (we want thisto be as fast as possible).
@typing.overload¶The
@overloaddecorator allows describing functions and methodsthat support multiple different combinations of argument types. A seriesof@overload-decorated definitions must be followed by exactly onenon-@overload-decorated definition (for the same function/method).The@overload-decorated definitions are for the benefit of thetype checker only, since they will be overwritten by thenon-@overload-decorated definition, while the latter is used atruntime but should be ignored by a type checker. At runtime, callinga@overload-decorated function directly will raiseNotImplementedError. An example of overload that gives a moreprecise type than can be expressed using a union or a type variable:@overloaddefprocess(response:None)->None:...@overloaddefprocess(response:int)->tuple[int,str]:...@overloaddefprocess(response:bytes)->str:...defprocess(response):<actualimplementation>
SeePEP 484 for details and comparison with other typing semantics.
@typing.final¶A decorator to indicate to type checkers that the decorated methodcannot be overridden, and the decorated class cannot be subclassed.For example:
classBase:@finaldefdone(self)->None:...classSub(Base):defdone(self)->None:# Error reported by type checker...@finalclassLeaf:...classOther(Leaf):# Error reported by type checker...
There is no runtime checking of these properties. SeePEP 591 formore details.
New in version 3.8.
@typing.no_type_check¶Decorator to indicate that annotations are not type hints.
This works as class or functiondecorator. With a class, itapplies recursively to all methods defined in that class (but notto methods defined in its superclasses or subclasses).
This mutates the function(s) in place.
@typing.no_type_check_decorator¶Decorator to give another decorator the
no_type_check()effect.This wraps the decorator with something that wraps the decoratedfunction in
no_type_check().
@typing.type_check_only¶Decorator to mark a class or function to be unavailable at runtime.
This decorator is itself not available at runtime. It is mainlyintended to mark classes that are defined in type stub files ifan implementation returns an instance of a private class:
@type_check_onlyclassResponse:# private or not available at runtimecode:intdefget_header(self,name:str)->str:...deffetch_response()->Response:...
Note that returning instances of private classes is not recommended.It is usually preferable to make such classes public.
Introspection helpers¶
typing.get_type_hints(obj,globalns=None,localns=None,include_extras=False)¶Return a dictionary containing type hints for a function, method, moduleor class object.
This is often the same as
obj.__annotations__. In addition,forward references encoded as string literals are handled by evaluatingthem inglobalsandlocalsnamespaces. If necessary,Optional[t]is added for function and method annotations if a defaultvalue equal toNoneis set. For a classC, returna dictionary constructed by merging all the__annotations__alongC.__mro__in reverse order.The function recursively replaces all
Annotated[T,...]withT,unlessinclude_extrasis set toTrue(seeAnnotatedformore information). For example:classStudent(NamedTuple):name:Annotated[str,'some marker']get_type_hints(Student)=={'name':str}get_type_hints(Student,include_extras=False)=={'name':str}get_type_hints(Student,include_extras=True)=={'name':Annotated[str,'some marker']}
Changed in version 3.9:Added
include_extrasparameter as part ofPEP 593.
typing.get_args(tp)¶
typing.get_origin(tp)¶Provide basic introspection for generic types and special typing forms.
For a typing object of the form
X[Y,Z,...]these functions returnXand(Y,Z,...). IfXis a generic alias for a builtin orcollectionsclass, it gets normalized to the original class.IfXis aUnionorLiteralcontained in anothergeneric type, the order of(Y,Z,...)may be different from the orderof the original arguments[Y,Z,...]due to type caching.For unsupported objects returnNoneand()correspondingly.Examples:assertget_origin(Dict[str,int])isdictassertget_args(Dict[int,str])==(int,str)assertget_origin(Union[int,str])isUnionassertget_args(Union[int,str])==(int,str)
New in version 3.8.
- class
typing.ForwardRef¶ A class used for internal typing representation of string forward references.For example,
List["SomeClass"]is implicitly transformed intoList[ForwardRef("SomeClass")]. This class should not be instantiated bya user, but may be used by introspection tools.Note
PEP 585 generic types such as
list["SomeClass"]will not beimplicitly transformed intolist[ForwardRef("SomeClass")]and thuswill not automatically resolve tolist[SomeClass].New in version 3.7.4.
Constant¶
typing.TYPE_CHECKING¶A special constant that is assumed to be
Trueby 3rd party statictype checkers. It isFalseat runtime. Usage:ifTYPE_CHECKING:importexpensive_moddeffun(arg:'expensive_mod.SomeType')->None:local_var:expensive_mod.AnotherType=other_fun()
The first type annotation must be enclosed in quotes, making it a“forward reference”, to hide the
expensive_modreference from theinterpreter runtime. Type annotations for local variables are notevaluated, so the second annotation does not need to be enclosed in quotes.Note
If
from__future__importannotationsis used,annotations are not evaluated at function definition time.Instead, they are stored as strings in__annotations__.This makes it unnecessary to use quotes around the annotation(seePEP 563).New in version 3.5.2.