@@ -214,7 +214,7 @@ subscription to denote expected types for container elements.
214
214
def notify_by_email(employees: Sequence[Employee],
215
215
overrides: Mapping[str, str]) -> None: ...
216
216
217
- Generics can be parameterized by using a new factory available in typing
217
+ Generics can be parameterized by using a factory available in typing
218
218
called :class: `TypeVar `.
219
219
220
220
::
@@ -271,16 +271,16 @@ that ``LoggedVar[t]`` is valid as a type::
271
271
for var in vars:
272
272
var.set(0)
273
273
274
- A generic type can have any number of type variables, and type variables may
275
- be constrained ::
274
+ A generic type can have any number of type variables. All varieties of
275
+ :class: ` TypeVar ` are permissible as parameters for a generic type ::
276
276
277
- from typing import TypeVar, Generic
278
- ...
277
+ from typing import TypeVar, Generic, Sequence
279
278
280
- T = TypeVar('T')
279
+ T = TypeVar('T', contravariant=True)
280
+ B = TypeVar('B', bound=Sequence[bytes], covariant=True)
281
281
S = TypeVar('S', int, str)
282
282
283
- class StrangePair (Generic[T, S]):
283
+ class WeirdTrio (Generic[T, B , S]):
284
284
...
285
285
286
286
Each type variable argument to :class: `Generic ` must be distinct.
@@ -856,7 +856,8 @@ These are not used in annotations. They are building blocks for creating generic
856
856
Usage::
857
857
858
858
T = TypeVar('T') # Can be anything
859
- A = TypeVar('A', str, bytes) # Must be str or bytes
859
+ S = TypeVar('S', bound=str) # Can be any subtype of str
860
+ A = TypeVar('A', str, bytes) # Must be exactly str or bytes
860
861
861
862
Type variables exist primarily for the benefit of static type
862
863
checkers. They serve as the parameters for generic types as well
@@ -867,29 +868,95 @@ These are not used in annotations. They are building blocks for creating generic
867
868
"""Return a list containing n references to x."""
868
869
return [x]*n
869
870
870
- def longest(x: A, y: A) -> A:
871
- """Return the longest of two strings."""
872
- return x if len(x) >= len(y) else y
873
871
874
- The latter example's signature is essentially the overloading
875
- of ``(str, str) -> str `` and ``(bytes, bytes) -> bytes ``. Also note
876
- that if the arguments are instances of some subclass of :class: `str `,
877
- the return type is still plain :class: `str `.
872
+ def print_capitalized(x: S) -> S:
873
+ """Print x capitalized, and return x."""
874
+ print(x.capitalize())
875
+ return x
876
+
877
+
878
+ def concatenate(x: A, y: A) -> A:
879
+ """Add two strings or bytes objects together."""
880
+ return x + y
881
+
882
+ Note that type variables can be *bound *, *constrained *, or neither, but
883
+ cannot be both bound *and * constrained.
884
+
885
+ Constrained type variables and bound type variables have different
886
+ semantics in several important ways. Using a *constrained * type variable
887
+ means that the ``TypeVar `` can only ever be solved as being exactly one of
888
+ the constraints given::
889
+
890
+ a = concatenate('one', 'two') # Ok, variable 'a' has type 'str'
891
+ b = concatenate(StringSubclass('one'), StringSubclass('two')) # Inferred type of variable 'b' is 'str',
892
+ # despite 'StringSubclass' being passed in
893
+ c = concatenate('one', b'two') # error: type variable 'A' can be either 'str' or 'bytes' in a function call, but not both
894
+
895
+ Using a *bound * type variable, however, means that the ``TypeVar `` will be
896
+ solved using the most specific type possible::
897
+
898
+ print_capitalized('a string') # Ok, output has type 'str'
899
+
900
+ class StringSubclass(str):
901
+ pass
902
+
903
+ print_capitalized(StringSubclass('another string')) # Ok, output has type 'StringSubclass'
904
+ print_capitalized(45) # error: int is not a subtype of str
905
+
906
+ Type variables can be bound to concrete types, abstract types (ABCs or
907
+ protocols), and even unions of types::
908
+
909
+ U = TypeVar('U', bound=str|bytes) # Can be any subtype of the union str|bytes
910
+ V = TypeVar('V', bound=SupportsAbs) # Can be anything with an __abs__ method
911
+
912
+ Bound type variables are particularly useful for annotating
913
+ :func: `classmethods <classmethod> ` that serve as alternative constructors.
914
+ In the following example (©
915
+ `Raymond Hettinger <https://www.youtube.com/watch?v=HTLu2DFOdTg >`_), the
916
+ type variable ``C `` is bound to the ``Circle `` class through the use of a
917
+ forward reference. Using this type variable to annotate the
918
+ ``with_circumference `` classmethod, rather than hardcoding the return type
919
+ as ``Circle ``, means that a type checker can correctly infer the return
920
+ type even if the method is called on a subclass::
921
+
922
+ import math
923
+
924
+ C = TypeVar('C', bound='Circle')
925
+
926
+ class Circle:
927
+ """An abstract circle"""
928
+
929
+ def __init__(self, radius: float) -> None:
930
+ self.radius = radius
931
+
932
+ # Use a type variable to show that the return type
933
+ # will always be an instance of whatever `cls` is
934
+ @classmethod
935
+ def with_circumference(cls: type[C], circumference: float) -> C:
936
+ """Create a circle with the specified circumference"""
937
+ radius = circumference / (math.pi * 2)
938
+ return cls(radius)
939
+
940
+
941
+ class Tire(Circle):
942
+ """A specialised circle (made out of rubber)"""
943
+
944
+ MATERIAL = 'rubber'
945
+
946
+
947
+ c = Circle.with_circumference(3) # Ok, variable 'c' has type 'Circle'
948
+ t = Tire.with_circumference(4) # Ok, variable 't' has type 'Tire' (not 'Circle')
878
949
879
950
At runtime, ``isinstance(x, T) `` will raise :exc: `TypeError `. In general,
880
951
:func: `isinstance ` and :func: `issubclass ` should not be used with types.
881
952
882
953
Type variables may be marked covariant or contravariant by passing
883
954
``covariant=True `` or ``contravariant=True ``. See :pep: `484 ` for more
884
- details. By default type variables are invariant. Alternatively,
885
- a type variable may specify an upper bound using ``bound=<type> ``.
886
- This means that an actual type substituted (explicitly or implicitly)
887
- for the type variable must be a subclass of the boundary type,
888
- see :pep: `484 `.
955
+ details. By default, type variables are invariant.
889
956
890
957
.. data :: AnyStr
891
958
892
- ``AnyStr `` is a type variable defined as
959
+ ``AnyStr `` is a :class: ` constrained type variable <TypeVar> ` defined as
893
960
``AnyStr = TypeVar('AnyStr', str, bytes) ``.
894
961
895
962
It is meant to be used for functions that may accept any kind of string
0 commit comments