26.1.typing — Support for type hints

New in version 3.5.

Source code:Lib/typing.py

Note

The typing module has been included in the standard library on aprovisional basis. New features mightbe added and API may change even between minor releases if deemednecessary by the core developers.


This module supports type hints as specified byPEP 484 andPEP 526.The most fundamental support consists of the typesAny,Union,Tuple,Callable,TypeVar, andGeneric. For full specification please seePEP 484. Fora 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.

26.1.1.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:

fromtypingimportListVector=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:

fromtypingimportDict,Tuple,ListConnectionOptions=Dict[str,str]Address=Tuple[str,int]Server=Tuple[Address,ConnectionOptions]defbroadcast_message(message:str,servers:List[Server])->None:...# The static type checker will treat the previous type signature as# being exactly equivalent to this one.defbroadcast_message(message:str,servers:List[Tuple[Tuple[str,int],Dict[str,str]]])->None:...

Note thatNone as a type hint is a special case and is replaced bytype(None).

26.1.2.NewType

Use theNewType() helper function 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 runtimethe statementDerived=NewType('Derived',Base) will makeDerived afunction 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.

26.1.3.Callable

Frameworks expecting callback functions of specific signatures might betype hinted usingCallable[[Arg1Type,Arg2Type],ReturnType].

For example:

fromtypingimportCallabledeffeeder(get_next_item:Callable[[],str])->None:# Bodydefasync_query(on_success:Callable[[int],None],on_error:Callable[[int,Exception],None])->None:# Body

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].

26.1.4.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.

fromtypingimportMapping,Sequencedefnotify_by_email(employees:Sequence[Employee],overrides:Mapping[str,str])->None:...

Generics can be parameterized by using a new factory available in typingcalledTypeVar.

fromtypingimportSequence,TypeVarT=TypeVar('T')# Declare type variabledeffirst(l:Sequence[T])->T:# Generic functionreturnl[0]

26.1.5.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 uses a metaclass that defines__getitem__() so thatLoggedVar[t] is valid as a type:

fromtypingimportIterabledefzero_all_vars(vars:Iterable[LoggedVar[int]])->None:forvarinvars:var.set(0)

A generic type can have any number of type variables, and type variables maybe constrained:

fromtypingimportTypeVar,Generic...T=TypeVar('T')S=TypeVar('S',int,str)classStrangePair(Generic[T,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:

fromtypingimportTypeVar,Generic,SizedT=TypeVar('T')classLinkedList(Sized,Generic[T]):...

When inheriting from generic classes, some type variables could be fixed:

fromtypingimportTypeVar,MappingT=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]:

fromtypingimportIterableclassMyIterable(Iterable):# Same as Iterable[Any]

User defined generic type aliases are also supported. Examples:

fromtypingimportTypeVar,Iterable,Tuple,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)

The metaclass used byGeneric is a subclass ofabc.ABCMeta.A generic class can be an ABC by including abstract methods or properties,and generic classes can also 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.

26.1.6.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 type onAny and assign it to any variable:

fromtypingimportAnya=None# type: Anya=[]# OKa=2# OKs=''# type: strs=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.

26.1.7.Classes, functions, and decorators

The module defines the following classes, functions and decorators:

classtyping.TypeVar

Type variable.

Usage:

T=TypeVar('T')# Can be anythingA=TypeVar('A',str,bytes)# Must be 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 class Generic for 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]*ndeflongest(x:A,y:A)->A:"""Return the longest of two strings."""returnxiflen(x)>=len(y)elsey

The latter example’s signature is essentially the overloadingof(str,str)->str and(bytes,bytes)->bytes. Also notethat if the arguments are instances of some subclass ofstr,the return type is still plainstr.

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 passingcovariant=True orcontravariant=True. SeePEP 484 for moredetails. By default type variables are invariant. Alternatively,a type variable may specify an upper bound usingbound=<type>.This means that an actual type substituted (explicitly or implicitly)for the type variable must be a subclass of the boundary type,seePEP 484.

classtyping.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
classtyping.Type(Generic[CT_co])

A variable annotated withC may 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 thatType[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 thatType[C] is covariant implies that all subclasses ofC should 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 forType are classes,Any,type variables, and unions of any of these types.For example:

defnew_non_team_user(user_class:Type[Union[BaseUser,ProUser]]):...

Type[Any] is equivalent toType which in turn is equivalenttotype, which is the root of Python’s metaclass hierarchy.

New in version 3.5.2.

classtyping.Iterable(Generic[T_co])

A generic version ofcollections.abc.Iterable.

classtyping.Iterator(Iterable[T_co])

A generic version ofcollections.abc.Iterator.

classtyping.Reversible(Iterable[T_co])

A generic version ofcollections.abc.Reversible.

classtyping.SupportsInt

An ABC with one abstract method__int__.

classtyping.SupportsFloat

An ABC with one abstract method__float__.

classtyping.SupportsComplex

An ABC with one abstract method__complex__.

classtyping.SupportsBytes

An ABC with one abstract method__bytes__.

classtyping.SupportsAbs

An ABC with one abstract method__abs__ that is covariantin its return type.

classtyping.SupportsRound

An ABC with one abstract method__round__that is covariant in its return type.

classtyping.Container(Generic[T_co])

A generic version ofcollections.abc.Container.

classtyping.Hashable

An alias tocollections.abc.Hashable

classtyping.Sized

An alias tocollections.abc.Sized

classtyping.Collection(Sized, Iterable[T_co], Container[T_co])

A generic version ofcollections.abc.Collection

New in version 3.6.

classtyping.AbstractSet(Sized, Collection[T_co])

A generic version ofcollections.abc.Set.

classtyping.MutableSet(AbstractSet[T])

A generic version ofcollections.abc.MutableSet.

classtyping.Mapping(Sized, Collection[KT], Generic[VT_co])

A generic version ofcollections.abc.Mapping.

classtyping.MutableMapping(Mapping[KT, VT])

A generic version ofcollections.abc.MutableMapping.

classtyping.Sequence(Reversible[T_co], Collection[T_co])

A generic version ofcollections.abc.Sequence.

classtyping.MutableSequence(Sequence[T])

A generic version ofcollections.abc.MutableSequence.

classtyping.ByteString(Sequence[int])

A generic version ofcollections.abc.ByteString.

This type represents the typesbytes,bytearray,andmemoryview.

As a shorthand for this type,bytes can be used toannotate arguments of any of the types mentioned above.

classtyping.Deque(deque, MutableSequence[T])

A generic version ofcollections.deque.

New in version 3.6.1.

classtyping.List(list, MutableSequence[T])

Generic version oflist.Useful for annotating return types. To annotate arguments it is preferredto use abstract collection types such asMapping,Sequence,orAbstractSet.

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]
classtyping.Set(set, MutableSet[T])

A generic version ofbuiltins.set.

classtyping.FrozenSet(frozenset, AbstractSet[T_co])

A generic version ofbuiltins.frozenset.

classtyping.MappingView(Sized, Iterable[T_co])

A generic version ofcollections.abc.MappingView.

classtyping.KeysView(MappingView[KT_co], AbstractSet[KT_co])

A generic version ofcollections.abc.KeysView.

classtyping.ItemsView(MappingView, Generic[KT_co, VT_co])

A generic version ofcollections.abc.ItemsView.

classtyping.ValuesView(MappingView[VT_co])

A generic version ofcollections.abc.ValuesView.

classtyping.Awaitable(Generic[T_co])

A generic version ofcollections.abc.Awaitable.

classtyping.Coroutine(Awaitable[V_co], Generic[T_co T_contra, V_co])

A generic version ofcollections.abc.Coroutine.The variance and order of type variablescorrespond to those ofGenerator, for example:

fromtypingimportList,Coroutinec=None# type: Coroutine[List[str], str, int]...x=c.send('hi')# type: List[str]asyncdefbar()->None:x=awaitc# type: int
classtyping.AsyncIterable(Generic[T_co])

A generic version ofcollections.abc.AsyncIterable.

classtyping.AsyncIterator(AsyncIterable[T_co])

A generic version ofcollections.abc.AsyncIterator.

classtyping.ContextManager(Generic[T_co])

A generic version ofcontextlib.AbstractContextManager.

New in version 3.6.

classtyping.AsyncContextManager(Generic[T_co])

An ABC with async abstract__aenter__() and__aexit__()methods.

New in version 3.6.

classtyping.Dict(dict, MutableMapping[KT, VT])

A generic version ofdict.The usage of this type is as follows:

defget_position_in_index(word_list:Dict[str,int],word:str)->int:returnword_list[word]
classtyping.DefaultDict(collections.defaultdict, MutableMapping[KT, VT])

A generic version ofcollections.defaultdict.

New in version 3.5.2.

classtyping.Counter(collections.Counter, Dict[T, int])

A generic version ofcollections.Counter.

New in version 3.6.1.

classtyping.ChainMap(collections.ChainMap, MutableMapping[KT, VT])

A generic version ofcollections.ChainMap.

New in version 3.6.1.

classtyping.Generator(Iterator[T_co], Generic[T_co, T_contra, V_co])

A generator can be annotated by the generic typeGenerator[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, theSendTypeofGenerator behaves contravariantly, not covariantly orinvariantly.

If your generator will only yield values, set theSendType andReturnType toNone:

definfinite_stream(start:int)->Generator[int,None,None]:whileTrue:yieldstartstart+=1

Alternatively, annotate your generator as having a return type ofeitherIterable[YieldType] orIterator[YieldType]:

definfinite_stream(start:int)->Iterator[int]:whileTrue:yieldstartstart+=1
classtyping.AsyncGenerator(AsyncIterator[T_co], Generic[T_co, T_contra])

An async generator can be annotated by the generic typeAsyncGenerator[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 noReturnType type parameter. As withGenerator, theSendType behaves contravariantly.

If your generator will only yield values, set theSendType toNone:

asyncdefinfinite_stream(start:int)->AsyncGenerator[int,None]:whileTrue:yieldstartstart=awaitincrement(start)

Alternatively, annotate your generator as having a return type ofeitherAsyncIterable[YieldType] orAsyncIterator[YieldType]:

asyncdefinfinite_stream(start:int)->AsyncIterator[int]:whileTrue:yieldstartstart=awaitincrement(start)

New in version 3.5.4.

classtyping.Text

Text is an alias forstr. It is provided to supply a forwardcompatible path for Python 2 code: in Python 2,Text is an alias forunicode.

UseText to 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.

classtyping.IO
classtyping.TextIO
classtyping.BinaryIO

Generic typeIO[AnyStr] and its subclassesTextIO(IO[str])andBinaryIO(IO[bytes])represent the types of I/O streams such as returned byopen().

classtyping.Pattern
classtyping.Match

These type aliasescorrespond to the return types fromre.compile() andre.match(). These types (and the corresponding functions)are generic inAnyStr and can be made specific by writingPattern[str],Pattern[bytes],Match[str], orMatch[bytes].

classtyping.NamedTuple

Typed version of 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 two extra attributes:_field_types,giving a dict mapping field names to types, and_field_defaults, a dictmapping field names to default values. (The field names are in the_fields attribute, which is part of the namedtuple API.)

NamedTuple subclasses 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.

typing.NewType(typ)

A helper function to indicate a distinct types 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.

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.get_type_hints(obj[,globals[,locals]])

Return a dictionary containing type hints for a function, method, moduleor class object.

This is often the same asobj.__annotations__. In addition,forward references encoded as string literals are handled by evaluatingthem inglobals andlocals namespaces. If necessary,Optional[t] is added for function and method annotations if a defaultvalue equal toNone is set. For a classC, returna dictionary constructed by merging all the__annotations__ alongC.__mro__ in reverse order.

@typing.overload

The@overload decorator 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.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 theno_type_check() effect.

This wraps the decorator with something that wraps the decoratedfunction inno_type_check().

typing.Any

Special type indicating an unconstrained type.

  • Every type is compatible withAny.

  • Any is compatible with every type.

typing.NoReturn

Special type indicating that a function never returns.For example:

fromtypingimportNoReturndefstop()->NoReturn:raiseRuntimeError('no way')

New in version 3.6.5.

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]
  • When a class and its subclass are present, the latter is skipped, e.g.:

    Union[int,object]==object
  • You cannot subclass or instantiate a union.

  • You cannot writeUnion[X][Y].

  • You can useOptional[X] as a shorthand forUnion[X,None].

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 theOptional qualifier on its typeannotation just because it is optional. For example:

deffoo(arg:int=0)->None:...

On the other hand, if an explicit value ofNone is allowed, theuse ofOptional is appropriate, whether the argument is optionalor not. For example:

deffoo(arg:Optional[int]=None)->None:...
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.

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.

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 plainCallable is equivalent toCallable[...,Any], and in turn tocollections.abc.Callable.

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

ClassVar accepts only types and cannot be further subscribed.

ClassVar is not a class itself, and should notbe used withisinstance() orissubclass().ClassVar does 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.AnyStr

AnyStr is a type variable defined 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
typing.TYPE_CHECKING

A special constant that is assumed to beTrue by 3rd party statictype checkers. It isFalse at runtime. Usage:

ifTYPE_CHECKING:importexpensive_moddeffun(arg:'expensive_mod.SomeType')->None:local_var:expensive_mod.AnotherType=other_fun()

Note that the first type annotation must be enclosed in quotes, making it a“forward reference”, to hide theexpensive_mod reference from theinterpreter runtime. Type annotations for local variables are notevaluated, so the second annotation does not need to be enclosed in quotes.

New in version 3.5.2.