mirror of
https://github.com/python/cpython.git
synced 2024-12-16 21:34:44 +08:00
Issue #24272: Initial docs for typing.py (PEP 484).
By Daniel Andrade Groppe and Ivan Levkivskyi.
This commit is contained in:
parent
13b74aef62
commit
eb184e0106
@ -13,3 +13,418 @@ fundamental support consists of the type :class:`Any`, :class:`Union`,
|
||||
:class:`Tuple`, :class:`Callable`, :class:`TypeVar`, and
|
||||
:class:`Generic`. For full specification please see :pep:`484`. For
|
||||
a simplified introduction to type hints see :pep:`483`.
|
||||
|
||||
|
||||
The function below takes and returns a string and is annotated as follows::
|
||||
|
||||
def greeting(name: str) -> str:
|
||||
return 'Hello ' + name
|
||||
|
||||
In the function `greeting`, the argument `name` is expected to by of type `str`
|
||||
and the return type `str`. Subtypes are accepted as arguments.
|
||||
|
||||
Type aliases
|
||||
------------
|
||||
|
||||
A type alias is defined by assigning the type to the alias::
|
||||
|
||||
Vector = List[float]
|
||||
|
||||
Callable
|
||||
--------
|
||||
|
||||
Frameworks expecting callback functions of specific signatures might be
|
||||
type hinted using `Callable[[Arg1Type, Arg2Type], ReturnType]`.
|
||||
|
||||
For example::
|
||||
|
||||
from typing import Callable
|
||||
|
||||
def feeder(get_next_item: Callable[[], str]) -> None:
|
||||
# Body
|
||||
|
||||
def async_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 specifying
|
||||
the call signature by substituting a literal ellipsis
|
||||
for the list of arguments in the type hint: `Callable[..., ReturnType]`.
|
||||
`None` as a type hint is a special case and is replaced by `type(None)`.
|
||||
|
||||
Generics
|
||||
--------
|
||||
|
||||
Since type information about objects kept in containers cannot be statically
|
||||
inferred in a generic way, abstract base classes have been extended to support
|
||||
subscription to denote expected types for container elements.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from typing import Mapping, Sequence
|
||||
|
||||
def notify_by_email(employees: Sequence[Employee],
|
||||
overrides: Mapping[str, str]) -> None: ...
|
||||
|
||||
Generics can be parametrized by using a new factory available in typing
|
||||
called TypeVar.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from typing import Sequence, TypeVar
|
||||
|
||||
T = TypeVar('T') # Declare type variable
|
||||
|
||||
def first(l: Sequence[T]) -> T: # Generic function
|
||||
return l[0]
|
||||
|
||||
|
||||
User-defined generic types
|
||||
--------------------------
|
||||
|
||||
A user-defined class can be defined as a generic class.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from typing import TypeVar, Generic
|
||||
from logging import Logger
|
||||
|
||||
T = TypeVar('T')
|
||||
|
||||
class LoggedVar(Generic[T]):
|
||||
def __init__(self, value: T, name: str, logger: Logger) -> None:
|
||||
self.name = name
|
||||
self.logger = logger
|
||||
self.value = value
|
||||
|
||||
def set(self, new: T) -> None:
|
||||
self.log('Set ' + repr(self.value))
|
||||
self.value = new
|
||||
|
||||
def get(self) -> T:
|
||||
self.log('Get ' + repr(self.value))
|
||||
return self.value
|
||||
|
||||
def log(self, message: str) -> None:
|
||||
self.logger.info('{}: {}'.format(self.name, message))
|
||||
|
||||
`Generic[T]` as a base class defines that the class `LoggedVar` takes a single
|
||||
type parameter `T` . This also makes `T` valid as a type within the class body.
|
||||
|
||||
The `Generic` base class uses a metaclass that defines `__getitem__` so that
|
||||
`LoggedVar[t]` is valid as a type::
|
||||
|
||||
from typing import Iterable
|
||||
|
||||
def zero_all_vars(vars: Iterable[LoggedVar[int]]) -> None:
|
||||
for var in vars:
|
||||
var.set(0)
|
||||
|
||||
A generic type can have any number of type variables, and type variables may
|
||||
be constrained::
|
||||
|
||||
from typing import TypeVar, Generic
|
||||
...
|
||||
|
||||
T = TypeVar('T')
|
||||
S = TypeVar('S', int, str)
|
||||
|
||||
class StrangePair(Generic[T, S]):
|
||||
...
|
||||
|
||||
Each type variable argument to `Generic` must be distinct.
|
||||
This is thus invalid::
|
||||
|
||||
from typing import TypeVar, Generic
|
||||
...
|
||||
|
||||
T = TypeVar('T')
|
||||
|
||||
class Pair(Generic[T, T]): # INVALID
|
||||
...
|
||||
|
||||
You can use multiple inheritance with `Generic`::
|
||||
|
||||
from typing import TypeVar, Generic, Sized
|
||||
|
||||
T = TypeVar('T')
|
||||
|
||||
class LinkedList(Sized, Generic[T]):
|
||||
...
|
||||
|
||||
Subclassing a generic class without specifying type parameters assumes `Any`
|
||||
for each position. In the following example, `MyIterable` is not generic but
|
||||
implicitly inherits from `Iterable[Any]`::
|
||||
|
||||
from typing import Iterable
|
||||
|
||||
class MyIterable(Iterable): # Same as Iterable[Any]
|
||||
|
||||
Generic metaclasses are not supported.
|
||||
|
||||
The `Any` type
|
||||
--------------
|
||||
|
||||
A special kind of type is `Any`. Every type is a subtype of `Any`.
|
||||
This is also true for the builtin type object. However, to the static type
|
||||
checker these are completely different.
|
||||
|
||||
When the type of a value is `object`, the type checker will reject almost all
|
||||
operations on it, and assigning it to a variable (or using it as a return value)
|
||||
of a more specialized type is a type error. On the other hand, when a value has
|
||||
type `Any`, the type checker will allow all operations on it, and a value of
|
||||
type `Any` can be assigned to a variable (or used as a return value) of a more
|
||||
constrained type.
|
||||
|
||||
Default argument values
|
||||
-----------------------
|
||||
|
||||
Use a literal ellipsis `...` to declare an argument as having a default value::
|
||||
|
||||
from typing import AnyStr
|
||||
|
||||
def foo(x: AnyStr, y: AnyStr = ...) -> AnyStr: ...
|
||||
|
||||
|
||||
Classes, functions, and decorators
|
||||
----------------------------------
|
||||
|
||||
The module defines the following classes, functions and decorators:
|
||||
|
||||
.. class:: Any
|
||||
|
||||
Special type indicating an unconstrained type.
|
||||
|
||||
* Any object is an instance of `Any`.
|
||||
* Any class is a subclass of `Any`.
|
||||
* As a special case, `Any` and `object` are subclasses of each other.
|
||||
|
||||
.. class:: TypeVar
|
||||
|
||||
Type variable.
|
||||
|
||||
Usage::
|
||||
|
||||
T = TypeVar('T') # Can be anything
|
||||
A = TypeVar('A', str, bytes) # Must be str or bytes
|
||||
|
||||
Type variables exist primarily for the benefit of static type
|
||||
checkers. They serve as the parameters for generic types as well
|
||||
as for generic function definitions. See class Generic for more
|
||||
information on generic types. Generic functions work as follows:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def repeat(x: T, n: int) -> Sequence[T]:
|
||||
"""Return a list containing n references to x."""
|
||||
return [x]*n
|
||||
|
||||
def longest(x: A, y: A) -> A:
|
||||
"""Return the longest of two strings."""
|
||||
return x if len(x) >= len(y) else y
|
||||
|
||||
The latter example's signature is essentially the overloading
|
||||
of `(str, str) -> str` and `(bytes, bytes) -> bytes`. Also note
|
||||
that if the arguments are instances of some subclass of `str`,
|
||||
the return type is still plain `str`.
|
||||
|
||||
At runtime, `isinstance(x, T)` will raise `TypeError`. In general,
|
||||
`isinstance` and `issublass` should not be used with types.
|
||||
|
||||
Type variables may be marked covariant or contravariant by passing
|
||||
`covariant=True` or `contravariant=True`. See :pep:`484` for more
|
||||
details. By default type variables are invariant.
|
||||
|
||||
.. class:: 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]
|
||||
|
||||
* If `Any` is present it is the sole survivor, e.g.::
|
||||
|
||||
Union[int, Any] == Any
|
||||
|
||||
* You cannot subclass or instantiate a union.
|
||||
|
||||
* You cannot write `Union[X][Y]`
|
||||
|
||||
* You can use `Optional[X]` as a shorthand for `Union[X, None]`.
|
||||
|
||||
.. class:: Optional
|
||||
|
||||
Optional type.
|
||||
|
||||
`Optional[X]` is equivalent to `Union[X, type(None)]`.
|
||||
|
||||
.. class:: Tuple
|
||||
|
||||
Tuple type; `Tuple[X, Y]` is the is the type of a tuple of two items
|
||||
with the first item of type X and the second of type Y.
|
||||
|
||||
Example: `Tuple[T1, T2]` is a tuple of two elements corresponding
|
||||
to type variables T1 and T2. `Tuple[int, float, str]` is a tuple
|
||||
of an int, a float and a string.
|
||||
|
||||
To specify a variable-length tuple of homogeneous type,
|
||||
use literal ellipsis, e.g. `Tuple[int, ...]`.
|
||||
|
||||
.. class:: Callable
|
||||
|
||||
Callable type; `Callable[[int], str]` is a function of (int) -> str.
|
||||
|
||||
The subscription syntax must always be used with exactly two
|
||||
values: the argument list and the return type. The argument list
|
||||
must be a list of types; the return type must be a single type.
|
||||
|
||||
There is no syntax to indicate optional or keyword arguments,
|
||||
such function types are rarely used as callback types.
|
||||
`Callable[..., ReturnType]` could be used to type hint a callable
|
||||
taking any number of arguments and returning `ReturnType`.
|
||||
A plain `Callable` is equivalent to `Callable[..., Any]`.
|
||||
|
||||
.. class:: Generic
|
||||
|
||||
Abstract base class for generic types.
|
||||
|
||||
A generic type is typically declared by inheriting from an
|
||||
instantiation of this class with one or more type variables.
|
||||
For example, a generic mapping type might be defined as::
|
||||
|
||||
class Mapping(Generic[KT, VT]):
|
||||
def __getitem__(self, key: KT) -> VT:
|
||||
...
|
||||
# Etc.
|
||||
|
||||
This class can then be used as follows::
|
||||
|
||||
X = TypeVar('X')
|
||||
Y = TypeVar('Y')
|
||||
def lookup_name(mapping: Mapping[X, Y], key: X, default: Y) -> Y:
|
||||
try:
|
||||
return mapping[key]
|
||||
except KeyError:
|
||||
return default
|
||||
|
||||
.. class:: Iterable(Generic[T_co])
|
||||
|
||||
.. class:: Iterator(Iterable[T_co])
|
||||
|
||||
.. class:: SupportsInt
|
||||
|
||||
.. class:: SupportsFloat
|
||||
|
||||
.. class:: SupportsAbs
|
||||
|
||||
.. class:: SupportsRound
|
||||
|
||||
.. class:: Reversible
|
||||
|
||||
.. class:: Container(Generic[T_co])
|
||||
|
||||
.. class:: AbstractSet(Sized, Iterable[T_co], Container[T_co])
|
||||
|
||||
.. class:: MutableSet(AbstractSet[T])
|
||||
|
||||
.. class:: Mapping(Sized, Iterable[KT_co], Container[KT_co], Generic[KT_co, VT_co])
|
||||
|
||||
.. class:: MutableMapping(Mapping[KT, VT])
|
||||
|
||||
.. class:: Sequence(Sized, Iterable[T_co], Container[T_co])
|
||||
|
||||
.. class:: MutableSequence(Sequence[T])
|
||||
|
||||
.. class:: ByteString(Sequence[int])
|
||||
|
||||
.. class:: List(list, MutableSequence[T])
|
||||
|
||||
.. class:: Set(set, MutableSet[T])
|
||||
|
||||
.. class:: MappingView(Sized, Iterable[T_co])
|
||||
|
||||
.. class:: KeysView(MappingView[KT_co], AbstractSet[KT_co])
|
||||
|
||||
.. class:: ItemsView(MappingView, Generic[KT_co, VT_co])
|
||||
|
||||
.. class:: ValuesView(MappingView[VT_co])
|
||||
|
||||
.. class:: Dict(dict, MutableMapping[KT, VT])
|
||||
|
||||
.. class:: Generator(Iterator[T_co], Generic[T_co, T_contra, V_co])
|
||||
|
||||
.. class:: io
|
||||
|
||||
Wrapper namespace for IO generic classes.
|
||||
|
||||
.. class:: re
|
||||
|
||||
Wrapper namespace for re type classes.
|
||||
|
||||
.. function:: NamedTuple(typename, fields)
|
||||
|
||||
Typed version of namedtuple.
|
||||
|
||||
Usage::
|
||||
|
||||
Employee = typing.NamedTuple('Employee', [('name', str), 'id', int)])
|
||||
|
||||
This is equivalent to::
|
||||
|
||||
Employee = collections.namedtuple('Employee', ['name', 'id'])
|
||||
|
||||
The resulting class has one extra attribute: _field_types,
|
||||
giving a dict mapping field names to types. (The field names
|
||||
are in the _fields attribute, which is part of the namedtuple
|
||||
API.)
|
||||
|
||||
.. function:: cast(typ, val)
|
||||
|
||||
Cast a value to a type.
|
||||
|
||||
This returns the value unchanged. To the type checker this
|
||||
signals that the return value has the designated type, but at
|
||||
runtime we intentionally don't check anything (we want this
|
||||
to be as fast as possible).
|
||||
|
||||
.. function:: get_type_hints(obj)
|
||||
|
||||
Return type hints for a function or method object.
|
||||
|
||||
This is often the same as obj.__annotations__, but it handles
|
||||
forward references encoded as string literals, and if necessary
|
||||
adds Optional[t] if a default value equal to None is set.
|
||||
|
||||
.. decorator:: no_type_check(arg)
|
||||
|
||||
Decorator to indicate that annotations are not type hints.
|
||||
|
||||
The argument must be a class or function; if it is a class, it
|
||||
applies recursively to all methods defined in that class (but not
|
||||
to methods defined in its superclasses or subclasses).
|
||||
|
||||
This mutates the function(s) in place.
|
||||
|
||||
.. decorator:: no_type_check_decorator(decorator)
|
||||
|
||||
Decorator to give another decorator the @no_type_check effect.
|
||||
|
||||
This wraps the decorator with something that wraps the decorated
|
||||
function in @no_type_check.
|
||||
|
Loading…
Reference in New Issue
Block a user