~dkuhlman/python-training-materials/Materials

« back to all changes in this revision

Viewing changes to python-3.5.2-docs-html/library/typing.html

  • Committer: Dave Kuhlman
  • Date: 2017-04-15 16:24:56 UTC
  • Revision ID: dkuhlman@davekuhlman.org-20170415162456-iav9vozzg4iwqwv3
Updated docs

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 
2
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
3
 
 
4
 
 
5
<html xmlns="http://www.w3.org/1999/xhtml">
 
6
  <head>
 
7
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
8
    
 
9
    <title>26.1. typing — Support for type hints &mdash; Python 3.5.2 documentation</title>
 
10
    
 
11
    <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
 
12
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
 
13
    
 
14
    <script type="text/javascript">
 
15
      var DOCUMENTATION_OPTIONS = {
 
16
        URL_ROOT:    '../',
 
17
        VERSION:     '3.5.2',
 
18
        COLLAPSE_INDEX: false,
 
19
        FILE_SUFFIX: '.html',
 
20
        HAS_SOURCE:  true
 
21
      };
 
22
    </script>
 
23
    <script type="text/javascript" src="../_static/jquery.js"></script>
 
24
    <script type="text/javascript" src="../_static/underscore.js"></script>
 
25
    <script type="text/javascript" src="../_static/doctools.js"></script>
 
26
    <script type="text/javascript" src="../_static/sidebar.js"></script>
 
27
    <link rel="search" type="application/opensearchdescription+xml"
 
28
          title="Search within Python 3.5.2 documentation"
 
29
          href="../_static/opensearch.xml"/>
 
30
    <link rel="author" title="About these documents" href="../about.html" />
 
31
    <link rel="copyright" title="Copyright" href="../copyright.html" />
 
32
    <link rel="top" title="Python 3.5.2 documentation" href="../contents.html" />
 
33
    <link rel="up" title="26. Development Tools" href="development.html" />
 
34
    <link rel="next" title="26.2. pydoc — Documentation generator and online help system" href="pydoc.html" />
 
35
    <link rel="prev" title="26. Development Tools" href="development.html" />
 
36
    <link rel="shortcut icon" type="image/png" href="../_static/py.png" />
 
37
    
 
38
    <script type="text/javascript" src="../_static/copybutton.js"></script>
 
39
    <script type="text/javascript" src="../_static/version_switch.js"></script>
 
40
    
 
41
    
 
42
 
 
43
 
 
44
  </head>
 
45
  <body role="document">  
 
46
    <div class="related" role="navigation" aria-label="related navigation">
 
47
      <h3>Navigation</h3>
 
48
      <ul>
 
49
        <li class="right" style="margin-right: 10px">
 
50
          <a href="../genindex.html" title="General Index"
 
51
             accesskey="I">index</a></li>
 
52
        <li class="right" >
 
53
          <a href="../py-modindex.html" title="Python Module Index"
 
54
             >modules</a> |</li>
 
55
        <li class="right" >
 
56
          <a href="pydoc.html" title="26.2. pydoc — Documentation generator and online help system"
 
57
             accesskey="N">next</a> |</li>
 
58
        <li class="right" >
 
59
          <a href="development.html" title="26. Development Tools"
 
60
             accesskey="P">previous</a> |</li>
 
61
        <li><img src="../_static/py.png" alt=""
 
62
                 style="vertical-align: middle; margin-top: -1px"/></li>
 
63
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
 
64
        <li>
 
65
          <span class="version_switcher_placeholder">3.5.2</span>
 
66
          <a href="../index.html">Documentation </a> &raquo;
 
67
        </li>
 
68
 
 
69
          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
 
70
          <li class="nav-item nav-item-2"><a href="development.html" accesskey="U">26. Development Tools</a> &raquo;</li>
 
71
    <li class="right">
 
72
        
 
73
 
 
74
    <div class="inline-search" style="display: none" role="search">
 
75
        <form class="inline-search" action="../search.html" method="get">
 
76
          <input placeholder="Quick search" type="text" name="q" />
 
77
          <input type="submit" value="Go" />
 
78
          <input type="hidden" name="check_keywords" value="yes" />
 
79
          <input type="hidden" name="area" value="default" />
 
80
        </form>
 
81
    </div>
 
82
    <script type="text/javascript">$('.inline-search').show(0);</script>
 
83
         |
 
84
    </li>
 
85
 
 
86
      </ul>
 
87
    </div>    
 
88
 
 
89
    <div class="document">
 
90
      <div class="documentwrapper">
 
91
        <div class="bodywrapper">
 
92
          <div class="body" role="main">
 
93
            
 
94
  <div class="section" id="module-typing">
 
95
<span id="typing-support-for-type-hints"></span><h1>26.1. <a class="reference internal" href="#module-typing" title="typing: Support for type hints (see PEP 484)."><code class="xref py py-mod docutils literal"><span class="pre">typing</span></code></a> &#8212; Support for type hints<a class="headerlink" href="#module-typing" title="Permalink to this headline">¶</a></h1>
 
96
<div class="versionadded">
 
97
<p><span class="versionmodified">New in version 3.5.</span></p>
 
98
</div>
 
99
<p><strong>Source code:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/typing.py">Lib/typing.py</a></p>
 
100
<hr class="docutils" />
 
101
<p>This module supports type hints as specified by <span class="target" id="index-0"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a>.  The most
 
102
fundamental support consists of the types <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>, <a class="reference internal" href="#typing.Union" title="typing.Union"><code class="xref py py-data docutils literal"><span class="pre">Union</span></code></a>,
 
103
<a class="reference internal" href="#typing.Tuple" title="typing.Tuple"><code class="xref py py-data docutils literal"><span class="pre">Tuple</span></code></a>, <a class="reference internal" href="#typing.Callable" title="typing.Callable"><code class="xref py py-data docutils literal"><span class="pre">Callable</span></code></a>, <a class="reference internal" href="#typing.TypeVar" title="typing.TypeVar"><code class="xref py py-class docutils literal"><span class="pre">TypeVar</span></code></a>, and
 
104
<a class="reference internal" href="#typing.Generic" title="typing.Generic"><code class="xref py py-class docutils literal"><span class="pre">Generic</span></code></a>.  For full specification please see <span class="target" id="index-1"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a>.  For
 
105
a simplified introduction to type hints see <span class="target" id="index-2"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0483"><strong>PEP 483</strong></a>.</p>
 
106
<p>The function below takes and returns a string and is annotated as follows:</p>
 
107
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">greeting</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
 
108
    <span class="k">return</span> <span class="s1">&#39;Hello &#39;</span> <span class="o">+</span> <span class="n">name</span>
 
109
</pre></div>
 
110
</div>
 
111
<p>In the function <code class="docutils literal"><span class="pre">greeting</span></code>, the argument <code class="docutils literal"><span class="pre">name</span></code> is expected to be of type
 
112
<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a> and the return type <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>. Subtypes are accepted as
 
113
arguments.</p>
 
114
<div class="section" id="type-aliases">
 
115
<h2>26.1.1. Type aliases<a class="headerlink" href="#type-aliases" title="Permalink to this headline">¶</a></h2>
 
116
<p>A type alias is defined by assigning the type to the alias. In this example,
 
117
<code class="docutils literal"><span class="pre">Vector</span></code> and <code class="docutils literal"><span class="pre">List[float]</span></code> will be treated as interchangeable synonyms:</p>
 
118
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">List</span>
 
119
<span class="n">Vector</span> <span class="o">=</span> <span class="n">List</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span>
 
120
 
 
121
<span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="n">scalar</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> <span class="n">vector</span><span class="p">:</span> <span class="n">Vector</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Vector</span><span class="p">:</span>
 
122
    <span class="k">return</span> <span class="p">[</span><span class="n">scalar</span> <span class="o">*</span> <span class="n">num</span> <span class="k">for</span> <span class="n">num</span> <span class="ow">in</span> <span class="n">vector</span><span class="p">]</span>
 
123
 
 
124
<span class="c1"># typechecks; a list of floats qualifies as a Vector.</span>
 
125
<span class="n">new_vector</span> <span class="o">=</span> <span class="n">scale</span><span class="p">(</span><span class="mf">2.0</span><span class="p">,</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">4.2</span><span class="p">,</span> <span class="mf">5.4</span><span class="p">])</span>
 
126
</pre></div>
 
127
</div>
 
128
<p>Type aliases are useful for simplifying complex type signatures. For example:</p>
 
129
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">List</span>
 
130
 
 
131
<span class="n">ConnectionOptions</span> <span class="o">=</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
 
132
<span class="n">Address</span> <span class="o">=</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>
 
133
<span class="n">Server</span> <span class="o">=</span> <span class="n">Tuple</span><span class="p">[</span><span class="n">Address</span><span class="p">,</span> <span class="n">ConnectionOptions</span><span class="p">]</span>
 
134
 
 
135
<span class="k">def</span> <span class="nf">broadcast_message</span><span class="p">(</span><span class="n">message</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">servers</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Server</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
136
    <span class="o">...</span>
 
137
 
 
138
<span class="c1"># The static type checker will treat the previous type signature as</span>
 
139
<span class="c1"># being exactly equivalent to this one.</span>
 
140
<span class="k">def</span> <span class="nf">broadcast_message</span><span class="p">(</span>
 
141
        <span class="n">message</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
 
142
        <span class="n">servers</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
143
    <span class="o">...</span>
 
144
</pre></div>
 
145
</div>
 
146
<p>Note that <code class="docutils literal"><span class="pre">None</span></code> as a type hint is a special case and is replaced by
 
147
<code class="docutils literal"><span class="pre">type(None)</span></code>.</p>
 
148
</div>
 
149
<div class="section" id="newtype">
 
150
<span id="distinct"></span><h2>26.1.2. NewType<a class="headerlink" href="#newtype" title="Permalink to this headline">¶</a></h2>
 
151
<p>Use the <a class="reference internal" href="#typing.NewType" title="typing.NewType"><code class="xref py py-func docutils literal"><span class="pre">NewType()</span></code></a> helper function to create distinct types:</p>
 
152
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">NewType</span>
 
153
 
 
154
<span class="n">UserId</span> <span class="o">=</span> <span class="n">NewType</span><span class="p">(</span><span class="s1">&#39;UserId&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
 
155
<span class="n">some_id</span> <span class="o">=</span> <span class="n">UserId</span><span class="p">(</span><span class="mi">524313</span><span class="p">)</span>
 
156
</pre></div>
 
157
</div>
 
158
<p>The static type checker will treat the new type as if it were a subclass
 
159
of the original type. This is useful in helping catch logical errors:</p>
 
160
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_user_name</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="n">UserId</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
 
161
    <span class="o">...</span>
 
162
 
 
163
<span class="c1"># typechecks</span>
 
164
<span class="n">user_a</span> <span class="o">=</span> <span class="n">get_user_name</span><span class="p">(</span><span class="n">UserId</span><span class="p">(</span><span class="mi">42351</span><span class="p">))</span>
 
165
 
 
166
<span class="c1"># does not typecheck; an int is not a UserId</span>
 
167
<span class="n">user_b</span> <span class="o">=</span> <span class="n">get_user_name</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
 
168
</pre></div>
 
169
</div>
 
170
<p>You may still perform all <code class="docutils literal"><span class="pre">int</span></code> operations on a variable of type <code class="docutils literal"><span class="pre">UserId</span></code>,
 
171
but the result will always be of type <code class="docutils literal"><span class="pre">int</span></code>. This lets you pass in a
 
172
<code class="docutils literal"><span class="pre">UserId</span></code> wherever an <code class="docutils literal"><span class="pre">int</span></code> might be expected, but will prevent you from
 
173
accidentally creating a <code class="docutils literal"><span class="pre">UserId</span></code> in an invalid way:</p>
 
174
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="c1"># &#39;output&#39; is of type &#39;int&#39;, not &#39;UserId&#39;</span>
 
175
<span class="n">output</span> <span class="o">=</span> <span class="n">UserId</span><span class="p">(</span><span class="mi">23413</span><span class="p">)</span> <span class="o">+</span> <span class="n">UserId</span><span class="p">(</span><span class="mi">54341</span><span class="p">)</span>
 
176
</pre></div>
 
177
</div>
 
178
<p>Note that these checks are enforced only by the static type checker. At runtime
 
179
the statement <code class="docutils literal"><span class="pre">Derived</span> <span class="pre">=</span> <span class="pre">NewType('Derived',</span> <span class="pre">Base)</span></code> will make <code class="docutils literal"><span class="pre">Derived</span></code> a
 
180
function that immediately returns whatever parameter you pass it. That means
 
181
the expression <code class="docutils literal"><span class="pre">Derived(some_value)</span></code> does not create a new class or introduce
 
182
any overhead beyond that of a regular function call.</p>
 
183
<p>More precisely, the expression <code class="docutils literal"><span class="pre">some_value</span> <span class="pre">is</span> <span class="pre">Derived(some_value)</span></code> is always
 
184
true at runtime.</p>
 
185
<p>This also means that it is not possible to create a subtype of <code class="docutils literal"><span class="pre">Derived</span></code>
 
186
since it is an identity function at runtime, not an actual type. Similarly, it
 
187
is not possible to create another <a class="reference internal" href="#typing.NewType" title="typing.NewType"><code class="xref py py-func docutils literal"><span class="pre">NewType()</span></code></a> based on a <code class="docutils literal"><span class="pre">Derived</span></code> type:</p>
 
188
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">NewType</span>
 
189
 
 
190
<span class="n">UserId</span> <span class="o">=</span> <span class="n">NewType</span><span class="p">(</span><span class="s1">&#39;UserId&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
 
191
 
 
192
<span class="c1"># Fails at runtime and does not typecheck</span>
 
193
<span class="k">class</span> <span class="nc">AdminUserId</span><span class="p">(</span><span class="n">UserId</span><span class="p">):</span> <span class="k">pass</span>
 
194
 
 
195
<span class="c1"># Also does not typecheck</span>
 
196
<span class="n">ProUserId</span> <span class="o">=</span> <span class="n">NewType</span><span class="p">(</span><span class="s1">&#39;ProUserId&#39;</span><span class="p">,</span> <span class="n">UserId</span><span class="p">)</span>
 
197
</pre></div>
 
198
</div>
 
199
<p>See <span class="target" id="index-3"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a> for more details.</p>
 
200
<div class="admonition note">
 
201
<p class="first admonition-title">Note</p>
 
202
<p>Recall that the use of a type alias declares two types to be <em>equivalent</em> to
 
203
one another. Doing <code class="docutils literal"><span class="pre">Alias</span> <span class="pre">=</span> <span class="pre">Original</span></code> will make the static type checker
 
204
treat <code class="docutils literal"><span class="pre">Alias</span></code> as being <em>exactly equivalent</em> to <code class="docutils literal"><span class="pre">Original</span></code> in all cases.
 
205
This is useful when you want to simplify complex type signatures.</p>
 
206
<p class="last">In contrast, <code class="docutils literal"><span class="pre">NewType</span></code> declares one type to be a <em>subtype</em> of another.
 
207
Doing <code class="docutils literal"><span class="pre">Derived</span> <span class="pre">=</span> <span class="pre">NewType('Derived',</span> <span class="pre">Original)</span></code> will make the static type
 
208
checker treat <code class="docutils literal"><span class="pre">Derived</span></code> as a <em>subclass</em> of <code class="docutils literal"><span class="pre">Original</span></code>, which means a
 
209
value of type <code class="docutils literal"><span class="pre">Original</span></code> cannot be used in places where a value of type
 
210
<code class="docutils literal"><span class="pre">Derived</span></code> is expected. This is useful when you want to prevent logic
 
211
errors with minimal runtime cost.</p>
 
212
</div>
 
213
</div>
 
214
<div class="section" id="callable">
 
215
<h2>26.1.3. Callable<a class="headerlink" href="#callable" title="Permalink to this headline">¶</a></h2>
 
216
<p>Frameworks expecting callback functions of specific signatures might be
 
217
type hinted using <code class="docutils literal"><span class="pre">Callable[[Arg1Type,</span> <span class="pre">Arg2Type],</span> <span class="pre">ReturnType]</span></code>.</p>
 
218
<p>For example:</p>
 
219
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Callable</span>
 
220
 
 
221
<span class="k">def</span> <span class="nf">feeder</span><span class="p">(</span><span class="n">get_next_item</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
222
    <span class="c1"># Body</span>
 
223
 
 
224
<span class="k">def</span> <span class="nf">async_query</span><span class="p">(</span><span class="n">on_success</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">int</span><span class="p">],</span> <span class="kc">None</span><span class="p">],</span>
 
225
                <span class="n">on_error</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">int</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">],</span> <span class="kc">None</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
226
    <span class="c1"># Body</span>
 
227
</pre></div>
 
228
</div>
 
229
<p>It is possible to declare the return type of a callable without specifying
 
230
the call signature by substituting a literal ellipsis
 
231
for the list of arguments in the type hint: <code class="docutils literal"><span class="pre">Callable[...,</span> <span class="pre">ReturnType]</span></code>.</p>
 
232
</div>
 
233
<div class="section" id="generics">
 
234
<h2>26.1.4. Generics<a class="headerlink" href="#generics" title="Permalink to this headline">¶</a></h2>
 
235
<p>Since type information about objects kept in containers cannot be statically
 
236
inferred in a generic way, abstract base classes have been extended to support
 
237
subscription to denote expected types for container elements.</p>
 
238
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Mapping</span><span class="p">,</span> <span class="n">Sequence</span>
 
239
 
 
240
<span class="k">def</span> <span class="nf">notify_by_email</span><span class="p">(</span><span class="n">employees</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">Employee</span><span class="p">],</span>
 
241
                    <span class="n">overrides</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span> <span class="o">...</span>
 
242
</pre></div>
 
243
</div>
 
244
<p>Generics can be parametrized by using a new factory available in typing
 
245
called <a class="reference internal" href="#typing.TypeVar" title="typing.TypeVar"><code class="xref py py-class docutils literal"><span class="pre">TypeVar</span></code></a>.</p>
 
246
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Sequence</span><span class="p">,</span> <span class="n">TypeVar</span>
 
247
 
 
248
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>      <span class="c1"># Declare type variable</span>
 
249
 
 
250
<span class="k">def</span> <span class="nf">first</span><span class="p">(</span><span class="n">l</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>   <span class="c1"># Generic function</span>
 
251
    <span class="k">return</span> <span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
 
252
</pre></div>
 
253
</div>
 
254
</div>
 
255
<div class="section" id="user-defined-generic-types">
 
256
<h2>26.1.5. User-defined generic types<a class="headerlink" href="#user-defined-generic-types" title="Permalink to this headline">¶</a></h2>
 
257
<p>A user-defined class can be defined as a generic class.</p>
 
258
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Generic</span>
 
259
<span class="kn">from</span> <span class="nn">logging</span> <span class="k">import</span> <span class="n">Logger</span>
 
260
 
 
261
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>
 
262
 
 
263
<span class="k">class</span> <span class="nc">LoggedVar</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">T</span><span class="p">]):</span>
 
264
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">T</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">logger</span><span class="p">:</span> <span class="n">Logger</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
265
        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
 
266
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="n">logger</span>
 
267
        <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
 
268
 
 
269
    <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">new</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
270
        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s1">&#39;Set &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
 
271
        <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">new</span>
 
272
 
 
273
    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span>
 
274
        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s1">&#39;Get &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
 
275
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span>
 
276
 
 
277
    <span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
278
        <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
 
279
</pre></div>
 
280
</div>
 
281
<p><code class="docutils literal"><span class="pre">Generic[T]</span></code> as a base class defines that the class <code class="docutils literal"><span class="pre">LoggedVar</span></code> takes a
 
282
single type parameter <code class="docutils literal"><span class="pre">T</span></code> . This also makes <code class="docutils literal"><span class="pre">T</span></code> valid as a type within the
 
283
class body.</p>
 
284
<p>The <a class="reference internal" href="#typing.Generic" title="typing.Generic"><code class="xref py py-class docutils literal"><span class="pre">Generic</span></code></a> base class uses a metaclass that defines
 
285
<a class="reference internal" href="../reference/datamodel.html#object.__getitem__" title="object.__getitem__"><code class="xref py py-meth docutils literal"><span class="pre">__getitem__()</span></code></a> so that <code class="docutils literal"><span class="pre">LoggedVar[t]</span></code> is valid as a type:</p>
 
286
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Iterable</span>
 
287
 
 
288
<span class="k">def</span> <span class="nf">zero_all_vars</span><span class="p">(</span><span class="nb">vars</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">LoggedVar</span><span class="p">[</span><span class="nb">int</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
289
    <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">:</span>
 
290
        <span class="n">var</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
 
291
</pre></div>
 
292
</div>
 
293
<p>A generic type can have any number of type variables, and type variables may
 
294
be constrained:</p>
 
295
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Generic</span>
 
296
<span class="o">...</span>
 
297
 
 
298
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>
 
299
<span class="n">S</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;S&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span>
 
300
 
 
301
<span class="k">class</span> <span class="nc">StrangePair</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">S</span><span class="p">]):</span>
 
302
    <span class="o">...</span>
 
303
</pre></div>
 
304
</div>
 
305
<p>Each type variable argument to <a class="reference internal" href="#typing.Generic" title="typing.Generic"><code class="xref py py-class docutils literal"><span class="pre">Generic</span></code></a> must be distinct.
 
306
This is thus invalid:</p>
 
307
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Generic</span>
 
308
<span class="o">...</span>
 
309
 
 
310
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>
 
311
 
 
312
<span class="k">class</span> <span class="nc">Pair</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">T</span><span class="p">]):</span>   <span class="c1"># INVALID</span>
 
313
    <span class="o">...</span>
 
314
</pre></div>
 
315
</div>
 
316
<p>You can use multiple inheritance with <a class="reference internal" href="#typing.Generic" title="typing.Generic"><code class="xref py py-class docutils literal"><span class="pre">Generic</span></code></a>:</p>
 
317
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Generic</span><span class="p">,</span> <span class="n">Sized</span>
 
318
 
 
319
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>
 
320
 
 
321
<span class="k">class</span> <span class="nc">LinkedList</span><span class="p">(</span><span class="n">Sized</span><span class="p">,</span> <span class="n">Generic</span><span class="p">[</span><span class="n">T</span><span class="p">]):</span>
 
322
    <span class="o">...</span>
 
323
</pre></div>
 
324
</div>
 
325
<p>When inheriting from generic classes, some type variables could be fixed:</p>
 
326
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Mapping</span>
 
327
 
 
328
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>
 
329
 
 
330
<span class="k">class</span> <span class="nc">MyDict</span><span class="p">(</span><span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">T</span><span class="p">]):</span>
 
331
    <span class="o">...</span>
 
332
</pre></div>
 
333
</div>
 
334
<p>In this case <code class="docutils literal"><span class="pre">MyDict</span></code> has a single parameter, <code class="docutils literal"><span class="pre">T</span></code>.</p>
 
335
<p>Using a generic class without specifying type parameters assumes
 
336
<a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> for each position. In the following example, <code class="docutils literal"><span class="pre">MyIterable</span></code> is
 
337
not generic but implicitly inherits from <code class="docutils literal"><span class="pre">Iterable[Any]</span></code>:</p>
 
338
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Iterable</span>
 
339
 
 
340
<span class="k">class</span> <span class="nc">MyIterable</span><span class="p">(</span><span class="n">Iterable</span><span class="p">):</span> <span class="c1"># Same as Iterable[Any]</span>
 
341
</pre></div>
 
342
</div>
 
343
<p>User defined generic type aliases are also supported. Examples:</p>
 
344
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">TypeVar</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span>
 
345
<span class="n">S</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;S&#39;</span><span class="p">)</span>
 
346
<span class="n">Response</span> <span class="o">=</span> <span class="n">Union</span><span class="p">[</span><span class="n">Iterable</span><span class="p">[</span><span class="n">S</span><span class="p">],</span> <span class="nb">int</span><span class="p">]</span>
 
347
 
 
348
<span class="c1"># Return type here is same as Union[Iterable[str], int]</span>
 
349
<span class="k">def</span> <span class="nf">response</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Response</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
 
350
    <span class="o">...</span>
 
351
 
 
352
<span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">)</span>
 
353
<span class="n">Vec</span> <span class="o">=</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="n">T</span><span class="p">,</span> <span class="n">T</span><span class="p">]]</span>
 
354
 
 
355
<span class="k">def</span> <span class="nf">inproduct</span><span class="p">(</span><span class="n">v</span><span class="p">:</span> <span class="n">Vec</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">T</span><span class="p">:</span> <span class="c1"># Same as Iterable[Tuple[T, T]]</span>
 
356
    <span class="k">return</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">y</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">v</span><span class="p">)</span>
 
357
</pre></div>
 
358
</div>
 
359
<p>The metaclass used by <a class="reference internal" href="#typing.Generic" title="typing.Generic"><code class="xref py py-class docutils literal"><span class="pre">Generic</span></code></a> is a subclass of <a class="reference internal" href="abc.html#abc.ABCMeta" title="abc.ABCMeta"><code class="xref py py-class docutils literal"><span class="pre">abc.ABCMeta</span></code></a>.
 
360
A generic class can be an ABC by including abstract methods or properties,
 
361
and generic classes can also have ABCs as base classes without a metaclass
 
362
conflict. Generic metaclasses are not supported. The outcome of parameterizing
 
363
generics is cached, and most types in the typing module are hashable and
 
364
comparable for equality.</p>
 
365
</div>
 
366
<div class="section" id="the-any-type">
 
367
<h2>26.1.6. The <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> type<a class="headerlink" href="#the-any-type" title="Permalink to this headline">¶</a></h2>
 
368
<p>A special kind of type is <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>. A static type checker will treat
 
369
every type as being compatible with <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> and <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> as being
 
370
compatible with every type.</p>
 
371
<p>This means that it is possible to perform any operation or method call on a
 
372
value of type on <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> and assign it to any variable:</p>
 
373
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Any</span>
 
374
 
 
375
<span class="n">a</span> <span class="o">=</span> <span class="kc">None</span>    <span class="c1"># type: Any</span>
 
376
<span class="n">a</span> <span class="o">=</span> <span class="p">[]</span>      <span class="c1"># OK</span>
 
377
<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>       <span class="c1"># OK</span>
 
378
 
 
379
<span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>      <span class="c1"># type: str</span>
 
380
<span class="n">s</span> <span class="o">=</span> <span class="n">a</span>       <span class="c1"># OK</span>
 
381
 
 
382
<span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
 
383
    <span class="c1"># Typechecks; &#39;item&#39; could be any type,</span>
 
384
    <span class="c1"># and that type might have a &#39;bar&#39; method</span>
 
385
    <span class="n">item</span><span class="o">.</span><span class="n">bar</span><span class="p">()</span>
 
386
    <span class="o">...</span>
 
387
</pre></div>
 
388
</div>
 
389
<p>Notice that no typechecking is performed when assigning a value of type
 
390
<a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> to a more precise type. For example, the static type checker did
 
391
not report an error when assigning <code class="docutils literal"><span class="pre">a</span></code> to <code class="docutils literal"><span class="pre">s</span></code> even though <code class="docutils literal"><span class="pre">s</span></code> was
 
392
declared to be of type <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a> and receives an <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal"><span class="pre">int</span></code></a> value at
 
393
runtime!</p>
 
394
<p>Furthermore, all functions without a return type or parameter types will
 
395
implicitly default to using <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>:</p>
 
396
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">legacy_parser</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
 
397
    <span class="o">...</span>
 
398
    <span class="k">return</span> <span class="n">data</span>
 
399
 
 
400
<span class="c1"># A static type checker will treat the above</span>
 
401
<span class="c1"># as having the same signature as:</span>
 
402
<span class="k">def</span> <span class="nf">legacy_parser</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
 
403
    <span class="o">...</span>
 
404
    <span class="k">return</span> <span class="n">data</span>
 
405
</pre></div>
 
406
</div>
 
407
<p>This behavior allows <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> to be used as an <em>escape hatch</em> when you
 
408
need to mix dynamically and statically typed code.</p>
 
409
<p>Contrast the behavior of <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> with the behavior of <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal"><span class="pre">object</span></code></a>.
 
410
Similar to <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>, every type is a subtype of <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal"><span class="pre">object</span></code></a>. However,
 
411
unlike <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>, the reverse is not true: <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal"><span class="pre">object</span></code></a> is <em>not</em> a
 
412
subtype of every other type.</p>
 
413
<p>That means when the type of a value is <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal"><span class="pre">object</span></code></a>, a type checker will
 
414
reject almost all operations on it, and assigning it to a variable (or using
 
415
it as a return value) of a more specialized type is a type error. For example:</p>
 
416
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">hash_a</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="nb">object</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
 
417
    <span class="c1"># Fails; an object does not have a &#39;magic&#39; method.</span>
 
418
    <span class="n">item</span><span class="o">.</span><span class="n">magic</span><span class="p">()</span>
 
419
    <span class="o">...</span>
 
420
 
 
421
<span class="k">def</span> <span class="nf">hash_b</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
 
422
    <span class="c1"># Typechecks</span>
 
423
    <span class="n">item</span><span class="o">.</span><span class="n">magic</span><span class="p">()</span>
 
424
    <span class="o">...</span>
 
425
 
 
426
<span class="c1"># Typechecks, since ints and strs are subclasses of object</span>
 
427
<span class="n">hash_a</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
 
428
<span class="n">hash_a</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">)</span>
 
429
 
 
430
<span class="c1"># Typechecks, since Any is compatible with all types</span>
 
431
<span class="n">hash_b</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
 
432
<span class="n">hash_b</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">)</span>
 
433
</pre></div>
 
434
</div>
 
435
<p>Use <a class="reference internal" href="functions.html#object" title="object"><code class="xref py py-class docutils literal"><span class="pre">object</span></code></a> to indicate that a value could be any type in a typesafe
 
436
manner. Use <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> to indicate that a value is dynamically typed.</p>
 
437
</div>
 
438
<div class="section" id="classes-functions-and-decorators">
 
439
<h2>26.1.7. Classes, functions, and decorators<a class="headerlink" href="#classes-functions-and-decorators" title="Permalink to this headline">¶</a></h2>
 
440
<p>The module defines the following classes, functions and decorators:</p>
 
441
<dl class="class">
 
442
<dt id="typing.TypeVar">
 
443
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">TypeVar</code><a class="headerlink" href="#typing.TypeVar" title="Permalink to this definition">¶</a></dt>
 
444
<dd><p>Type variable.</p>
 
445
<p>Usage:</p>
 
446
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">)</span>  <span class="c1"># Can be anything</span>
 
447
<span class="n">A</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">)</span>  <span class="c1"># Must be str or bytes</span>
 
448
</pre></div>
 
449
</div>
 
450
<p>Type variables exist primarily for the benefit of static type
 
451
checkers.  They serve as the parameters for generic types as well
 
452
as for generic function definitions.  See class Generic for more
 
453
information on generic types.  Generic functions work as follows:</p>
 
454
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">repeat</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
 
455
    <span class="sd">&quot;&quot;&quot;Return a list containing n references to x.&quot;&quot;&quot;</span>
 
456
    <span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">*</span><span class="n">n</span>
 
457
 
 
458
<span class="k">def</span> <span class="nf">longest</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">A</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">A</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">A</span><span class="p">:</span>
 
459
    <span class="sd">&quot;&quot;&quot;Return the longest of two strings.&quot;&quot;&quot;</span>
 
460
    <span class="k">return</span> <span class="n">x</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">else</span> <span class="n">y</span>
 
461
</pre></div>
 
462
</div>
 
463
<p>The latter example&#8217;s signature is essentially the overloading
 
464
of <code class="docutils literal"><span class="pre">(str,</span> <span class="pre">str)</span> <span class="pre">-&gt;</span> <span class="pre">str</span></code> and <code class="docutils literal"><span class="pre">(bytes,</span> <span class="pre">bytes)</span> <span class="pre">-&gt;</span> <span class="pre">bytes</span></code>.  Also note
 
465
that if the arguments are instances of some subclass of <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>,
 
466
the return type is still plain <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>.</p>
 
467
<p>At runtime, <code class="docutils literal"><span class="pre">isinstance(x,</span> <span class="pre">T)</span></code> will raise <a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a>.  In general,
 
468
<a class="reference internal" href="functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal"><span class="pre">isinstance()</span></code></a> and <a class="reference internal" href="functions.html#issubclass" title="issubclass"><code class="xref py py-func docutils literal"><span class="pre">issubclass()</span></code></a> should not be used with types.</p>
 
469
<p>Type variables may be marked covariant or contravariant by passing
 
470
<code class="docutils literal"><span class="pre">covariant=True</span></code> or <code class="docutils literal"><span class="pre">contravariant=True</span></code>.  See <span class="target" id="index-4"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a> for more
 
471
details.  By default type variables are invariant.  Alternatively,
 
472
a type variable may specify an upper bound using <code class="docutils literal"><span class="pre">bound=&lt;type&gt;</span></code>.
 
473
This means that an actual type substituted (explicitly or implicitly)
 
474
for the type variable must be a subclass of the boundary type,
 
475
see <span class="target" id="index-5"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a>.</p>
 
476
</dd></dl>
 
477
 
 
478
<dl class="class">
 
479
<dt id="typing.Generic">
 
480
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Generic</code><a class="headerlink" href="#typing.Generic" title="Permalink to this definition">¶</a></dt>
 
481
<dd><p>Abstract base class for generic types.</p>
 
482
<p>A generic type is typically declared by inheriting from an
 
483
instantiation of this class with one or more type variables.
 
484
For example, a generic mapping type might be defined as:</p>
 
485
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Mapping</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">KT</span><span class="p">,</span> <span class="n">VT</span><span class="p">]):</span>
 
486
    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="n">KT</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">VT</span><span class="p">:</span>
 
487
        <span class="o">...</span>
 
488
        <span class="c1"># Etc.</span>
 
489
</pre></div>
 
490
</div>
 
491
<p>This class can then be used as follows:</p>
 
492
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">X</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;X&#39;</span><span class="p">)</span>
 
493
<span class="n">Y</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;Y&#39;</span><span class="p">)</span>
 
494
 
 
495
<span class="k">def</span> <span class="nf">lookup_name</span><span class="p">(</span><span class="n">mapping</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">],</span> <span class="n">key</span><span class="p">:</span> <span class="n">X</span><span class="p">,</span> <span class="n">default</span><span class="p">:</span> <span class="n">Y</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Y</span><span class="p">:</span>
 
496
    <span class="k">try</span><span class="p">:</span>
 
497
        <span class="k">return</span> <span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
 
498
    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
 
499
        <span class="k">return</span> <span class="n">default</span>
 
500
</pre></div>
 
501
</div>
 
502
</dd></dl>
 
503
 
 
504
<dl class="class">
 
505
<dt id="typing.Type">
 
506
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Type</code><span class="sig-paren">(</span><em>Generic[CT_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Type" title="Permalink to this definition">¶</a></dt>
 
507
<dd><p>A variable annotated with <code class="docutils literal"><span class="pre">C</span></code> may accept a value of type <code class="docutils literal"><span class="pre">C</span></code>. In
 
508
contrast, a variable annotated with <code class="docutils literal"><span class="pre">Type[C]</span></code> may accept values that are
 
509
classes themselves &#8211; specifically, it will accept the <em>class object</em> of
 
510
<code class="docutils literal"><span class="pre">C</span></code>. For example:</p>
 
511
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="mi">3</span>         <span class="c1"># Has type &#39;int&#39;</span>
 
512
<span class="n">b</span> <span class="o">=</span> <span class="nb">int</span>       <span class="c1"># Has type &#39;Type[int]&#39;</span>
 
513
<span class="n">c</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>   <span class="c1"># Also has type &#39;Type[int]&#39;</span>
 
514
</pre></div>
 
515
</div>
 
516
<p>Note that <code class="docutils literal"><span class="pre">Type[C]</span></code> is covariant:</p>
 
517
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">User</span><span class="p">:</span> <span class="o">...</span>
 
518
<span class="k">class</span> <span class="nc">BasicUser</span><span class="p">(</span><span class="n">User</span><span class="p">):</span> <span class="o">...</span>
 
519
<span class="k">class</span> <span class="nc">ProUser</span><span class="p">(</span><span class="n">User</span><span class="p">):</span> <span class="o">...</span>
 
520
<span class="k">class</span> <span class="nc">TeamUser</span><span class="p">(</span><span class="n">User</span><span class="p">):</span> <span class="o">...</span>
 
521
 
 
522
<span class="c1"># Accepts User, BasicUser, ProUser, TeamUser, ...</span>
 
523
<span class="k">def</span> <span class="nf">make_new_user</span><span class="p">(</span><span class="n">user_class</span><span class="p">:</span> <span class="n">Type</span><span class="p">[</span><span class="n">User</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">User</span><span class="p">:</span>
 
524
    <span class="c1"># ...</span>
 
525
    <span class="k">return</span> <span class="n">user_class</span><span class="p">()</span>
 
526
</pre></div>
 
527
</div>
 
528
<p>The fact that <code class="docutils literal"><span class="pre">Type[C]</span></code> is covariant implies that all subclasses of
 
529
<code class="docutils literal"><span class="pre">C</span></code> should implement the same constructor signature and class method
 
530
signatures as <code class="docutils literal"><span class="pre">C</span></code>. The type checker should flag violations of this,
 
531
but should also allow constructor calls in subclasses that match the
 
532
constructor calls in the indicated base class. How the type checker is
 
533
required to handle this particular case may change in future revisions of
 
534
<span class="target" id="index-6"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a>.</p>
 
535
<p>The only legal parameters for <a class="reference internal" href="#typing.Type" title="typing.Type"><code class="xref py py-class docutils literal"><span class="pre">Type</span></code></a> are classes, unions of classes, and
 
536
<a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>. For example:</p>
 
537
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">new_non_team_user</span><span class="p">(</span><span class="n">user_class</span><span class="p">:</span> <span class="n">Type</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">BaseUser</span><span class="p">,</span> <span class="n">ProUser</span><span class="p">]]):</span> <span class="o">...</span>
 
538
</pre></div>
 
539
</div>
 
540
<p><code class="docutils literal"><span class="pre">Type[Any]</span></code> is equivalent to <code class="docutils literal"><span class="pre">Type</span></code> which in turn is equivalent
 
541
to <code class="docutils literal"><span class="pre">type</span></code>, which is the root of Python&#8217;s metaclass hierarchy.</p>
 
542
</dd></dl>
 
543
 
 
544
<dl class="class">
 
545
<dt id="typing.Iterable">
 
546
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Iterable</code><span class="sig-paren">(</span><em>Generic[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Iterable" title="Permalink to this definition">¶</a></dt>
 
547
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Iterable" title="collections.abc.Iterable"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Iterable</span></code></a>.</p>
 
548
</dd></dl>
 
549
 
 
550
<dl class="class">
 
551
<dt id="typing.Iterator">
 
552
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Iterator</code><span class="sig-paren">(</span><em>Iterable[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Iterator" title="Permalink to this definition">¶</a></dt>
 
553
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Iterator" title="collections.abc.Iterator"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Iterator</span></code></a>.</p>
 
554
</dd></dl>
 
555
 
 
556
<dl class="class">
 
557
<dt id="typing.Reversible">
 
558
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Reversible</code><span class="sig-paren">(</span><em>Iterable[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Reversible" title="Permalink to this definition">¶</a></dt>
 
559
<dd><p>A generic version of <code class="xref py py-class docutils literal"><span class="pre">collections.abc.Reversible</span></code>.</p>
 
560
</dd></dl>
 
561
 
 
562
<dl class="class">
 
563
<dt id="typing.SupportsInt">
 
564
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">SupportsInt</code><a class="headerlink" href="#typing.SupportsInt" title="Permalink to this definition">¶</a></dt>
 
565
<dd><p>An ABC with one abstract method <code class="docutils literal"><span class="pre">__int__</span></code>.</p>
 
566
</dd></dl>
 
567
 
 
568
<dl class="class">
 
569
<dt id="typing.SupportsFloat">
 
570
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">SupportsFloat</code><a class="headerlink" href="#typing.SupportsFloat" title="Permalink to this definition">¶</a></dt>
 
571
<dd><p>An ABC with one abstract method <code class="docutils literal"><span class="pre">__float__</span></code>.</p>
 
572
</dd></dl>
 
573
 
 
574
<dl class="class">
 
575
<dt id="typing.SupportsAbs">
 
576
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">SupportsAbs</code><a class="headerlink" href="#typing.SupportsAbs" title="Permalink to this definition">¶</a></dt>
 
577
<dd><p>An ABC with one abstract method <code class="docutils literal"><span class="pre">__abs__</span></code> that is covariant
 
578
in its return type.</p>
 
579
</dd></dl>
 
580
 
 
581
<dl class="class">
 
582
<dt id="typing.SupportsRound">
 
583
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">SupportsRound</code><a class="headerlink" href="#typing.SupportsRound" title="Permalink to this definition">¶</a></dt>
 
584
<dd><p>An ABC with one abstract method <code class="docutils literal"><span class="pre">__round__</span></code>
 
585
that is covariant in its return type.</p>
 
586
</dd></dl>
 
587
 
 
588
<dl class="class">
 
589
<dt id="typing.Container">
 
590
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Container</code><span class="sig-paren">(</span><em>Generic[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Container" title="Permalink to this definition">¶</a></dt>
 
591
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Container" title="collections.abc.Container"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Container</span></code></a>.</p>
 
592
</dd></dl>
 
593
 
 
594
<dl class="class">
 
595
<dt id="typing.Hashable">
 
596
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Hashable</code><a class="headerlink" href="#typing.Hashable" title="Permalink to this definition">¶</a></dt>
 
597
<dd><p>An alias to <a class="reference internal" href="collections.abc.html#collections.abc.Hashable" title="collections.abc.Hashable"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Hashable</span></code></a></p>
 
598
</dd></dl>
 
599
 
 
600
<dl class="class">
 
601
<dt id="typing.Sized">
 
602
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Sized</code><a class="headerlink" href="#typing.Sized" title="Permalink to this definition">¶</a></dt>
 
603
<dd><p>An alias to <a class="reference internal" href="collections.abc.html#collections.abc.Sized" title="collections.abc.Sized"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Sized</span></code></a></p>
 
604
</dd></dl>
 
605
 
 
606
<dl class="class">
 
607
<dt id="typing.AbstractSet">
 
608
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">AbstractSet</code><span class="sig-paren">(</span><em>Sized, Iterable[T_co], Container[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.AbstractSet" title="Permalink to this definition">¶</a></dt>
 
609
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Set" title="collections.abc.Set"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Set</span></code></a>.</p>
 
610
</dd></dl>
 
611
 
 
612
<dl class="class">
 
613
<dt id="typing.MutableSet">
 
614
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">MutableSet</code><span class="sig-paren">(</span><em>AbstractSet[T]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.MutableSet" title="Permalink to this definition">¶</a></dt>
 
615
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.MutableSet" title="collections.abc.MutableSet"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.MutableSet</span></code></a>.</p>
 
616
</dd></dl>
 
617
 
 
618
<dl class="class">
 
619
<dt id="typing.Mapping">
 
620
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Mapping</code><span class="sig-paren">(</span><em>Sized, Iterable[KT], Container[KT], Generic[VT_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Mapping" title="Permalink to this definition">¶</a></dt>
 
621
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Mapping" title="collections.abc.Mapping"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Mapping</span></code></a>.</p>
 
622
</dd></dl>
 
623
 
 
624
<dl class="class">
 
625
<dt id="typing.MutableMapping">
 
626
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">MutableMapping</code><span class="sig-paren">(</span><em>Mapping[KT, VT]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.MutableMapping" title="Permalink to this definition">¶</a></dt>
 
627
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.MutableMapping" title="collections.abc.MutableMapping"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.MutableMapping</span></code></a>.</p>
 
628
</dd></dl>
 
629
 
 
630
<dl class="class">
 
631
<dt id="typing.Sequence">
 
632
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Sequence</code><span class="sig-paren">(</span><em>Sized, Iterable[T_co], Container[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Sequence" title="Permalink to this definition">¶</a></dt>
 
633
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Sequence" title="collections.abc.Sequence"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Sequence</span></code></a>.</p>
 
634
</dd></dl>
 
635
 
 
636
<dl class="class">
 
637
<dt id="typing.MutableSequence">
 
638
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">MutableSequence</code><span class="sig-paren">(</span><em>Sequence[T]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.MutableSequence" title="Permalink to this definition">¶</a></dt>
 
639
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.MutableSequence" title="collections.abc.MutableSequence"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.MutableSequence</span></code></a>.</p>
 
640
</dd></dl>
 
641
 
 
642
<dl class="class">
 
643
<dt id="typing.ByteString">
 
644
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">ByteString</code><span class="sig-paren">(</span><em>Sequence[int]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.ByteString" title="Permalink to this definition">¶</a></dt>
 
645
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.ByteString" title="collections.abc.ByteString"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.ByteString</span></code></a>.</p>
 
646
<p>This type represents the types <a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>, <a class="reference internal" href="functions.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal"><span class="pre">bytearray</span></code></a>,
 
647
and <a class="reference internal" href="stdtypes.html#memoryview" title="memoryview"><code class="xref py py-class docutils literal"><span class="pre">memoryview</span></code></a>.</p>
 
648
<p>As a shorthand for this type, <a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a> can be used to
 
649
annotate arguments of any of the types mentioned above.</p>
 
650
</dd></dl>
 
651
 
 
652
<dl class="class">
 
653
<dt id="typing.List">
 
654
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">List</code><span class="sig-paren">(</span><em>list, MutableSequence[T]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.List" title="Permalink to this definition">¶</a></dt>
 
655
<dd><p>Generic version of <a class="reference internal" href="stdtypes.html#list" title="list"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a>.
 
656
Useful for annotating return types. To annotate arguments it is preferred
 
657
to use abstract collection types such as <a class="reference internal" href="#typing.Mapping" title="typing.Mapping"><code class="xref py py-class docutils literal"><span class="pre">Mapping</span></code></a>, <a class="reference internal" href="#typing.Sequence" title="typing.Sequence"><code class="xref py py-class docutils literal"><span class="pre">Sequence</span></code></a>,
 
658
or <a class="reference internal" href="#typing.AbstractSet" title="typing.AbstractSet"><code class="xref py py-class docutils literal"><span class="pre">AbstractSet</span></code></a>.</p>
 
659
<p>This type may be used as follows:</p>
 
660
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">T</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span>
 
661
 
 
662
<span class="k">def</span> <span class="nf">vec2</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">T</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
 
663
    <span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span>
 
664
 
 
665
<span class="k">def</span> <span class="nf">keep_positives</span><span class="p">(</span><span class="n">vector</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="n">T</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">T</span><span class="p">]:</span>
 
666
    <span class="k">return</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">vector</span> <span class="k">if</span> <span class="n">item</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">]</span>
 
667
</pre></div>
 
668
</div>
 
669
</dd></dl>
 
670
 
 
671
<dl class="class">
 
672
<dt id="typing.Set">
 
673
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Set</code><span class="sig-paren">(</span><em>set, MutableSet[T]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Set" title="Permalink to this definition">¶</a></dt>
 
674
<dd><p>A generic version of <a class="reference internal" href="stdtypes.html#set" title="set"><code class="xref py py-class docutils literal"><span class="pre">builtins.set</span></code></a>.</p>
 
675
</dd></dl>
 
676
 
 
677
<dl class="class">
 
678
<dt id="typing.FrozenSet">
 
679
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">FrozenSet</code><span class="sig-paren">(</span><em>frozenset, AbstractSet[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.FrozenSet" title="Permalink to this definition">¶</a></dt>
 
680
<dd><p>A generic version of <a class="reference internal" href="stdtypes.html#frozenset" title="frozenset"><code class="xref py py-class docutils literal"><span class="pre">builtins.frozenset</span></code></a>.</p>
 
681
</dd></dl>
 
682
 
 
683
<dl class="class">
 
684
<dt id="typing.MappingView">
 
685
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">MappingView</code><span class="sig-paren">(</span><em>Sized, Iterable[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.MappingView" title="Permalink to this definition">¶</a></dt>
 
686
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.MappingView" title="collections.abc.MappingView"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.MappingView</span></code></a>.</p>
 
687
</dd></dl>
 
688
 
 
689
<dl class="class">
 
690
<dt id="typing.KeysView">
 
691
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">KeysView</code><span class="sig-paren">(</span><em>MappingView[KT_co], AbstractSet[KT_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.KeysView" title="Permalink to this definition">¶</a></dt>
 
692
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.KeysView" title="collections.abc.KeysView"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.KeysView</span></code></a>.</p>
 
693
</dd></dl>
 
694
 
 
695
<dl class="class">
 
696
<dt id="typing.ItemsView">
 
697
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">ItemsView</code><span class="sig-paren">(</span><em>MappingView, Generic[KT_co, VT_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.ItemsView" title="Permalink to this definition">¶</a></dt>
 
698
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.ItemsView" title="collections.abc.ItemsView"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.ItemsView</span></code></a>.</p>
 
699
</dd></dl>
 
700
 
 
701
<dl class="class">
 
702
<dt id="typing.ValuesView">
 
703
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">ValuesView</code><span class="sig-paren">(</span><em>MappingView[VT_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.ValuesView" title="Permalink to this definition">¶</a></dt>
 
704
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.ValuesView" title="collections.abc.ValuesView"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.ValuesView</span></code></a>.</p>
 
705
</dd></dl>
 
706
 
 
707
<dl class="class">
 
708
<dt id="typing.Awaitable">
 
709
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Awaitable</code><span class="sig-paren">(</span><em>Generic[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Awaitable" title="Permalink to this definition">¶</a></dt>
 
710
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Awaitable" title="collections.abc.Awaitable"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Awaitable</span></code></a>.</p>
 
711
</dd></dl>
 
712
 
 
713
<dl class="class">
 
714
<dt id="typing.Coroutine">
 
715
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Coroutine</code><span class="sig-paren">(</span><em>Awaitable[V_co], Generic[T_co T_contra, V_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Coroutine" title="Permalink to this definition">¶</a></dt>
 
716
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.Coroutine" title="collections.abc.Coroutine"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Coroutine</span></code></a>.
 
717
The variance and order of type variables
 
718
correspond to those of <a class="reference internal" href="#typing.Generator" title="typing.Generator"><code class="xref py py-class docutils literal"><span class="pre">Generator</span></code></a>, for example:</p>
 
719
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Coroutine</span>
 
720
<span class="n">c</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># type: Coroutine[List[str], str, int]</span>
 
721
<span class="o">...</span>
 
722
<span class="n">x</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;hi&#39;</span><span class="p">)</span> <span class="c1"># type: List[str]</span>
 
723
<span class="k">async</span> <span class="k">def</span> <span class="nf">bar</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
724
    <span class="n">x</span> <span class="o">=</span> <span class="k">await</span> <span class="n">c</span> <span class="c1"># type: int</span>
 
725
</pre></div>
 
726
</div>
 
727
</dd></dl>
 
728
 
 
729
<dl class="class">
 
730
<dt id="typing.AsyncIterable">
 
731
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">AsyncIterable</code><span class="sig-paren">(</span><em>Generic[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.AsyncIterable" title="Permalink to this definition">¶</a></dt>
 
732
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.AsyncIterable" title="collections.abc.AsyncIterable"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.AsyncIterable</span></code></a>.</p>
 
733
</dd></dl>
 
734
 
 
735
<dl class="class">
 
736
<dt id="typing.AsyncIterator">
 
737
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">AsyncIterator</code><span class="sig-paren">(</span><em>AsyncIterable[T_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.AsyncIterator" title="Permalink to this definition">¶</a></dt>
 
738
<dd><p>A generic version of <a class="reference internal" href="collections.abc.html#collections.abc.AsyncIterator" title="collections.abc.AsyncIterator"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.AsyncIterator</span></code></a>.</p>
 
739
</dd></dl>
 
740
 
 
741
<dl class="class">
 
742
<dt id="typing.Dict">
 
743
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Dict</code><span class="sig-paren">(</span><em>dict, MutableMapping[KT, VT]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Dict" title="Permalink to this definition">¶</a></dt>
 
744
<dd><p>A generic version of <a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a>.
 
745
The usage of this type is as follows:</p>
 
746
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_position_in_index</span><span class="p">(</span><span class="n">word_list</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="n">word</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
 
747
    <span class="k">return</span> <span class="n">word_list</span><span class="p">[</span><span class="n">word</span><span class="p">]</span>
 
748
</pre></div>
 
749
</div>
 
750
</dd></dl>
 
751
 
 
752
<dl class="class">
 
753
<dt id="typing.DefaultDict">
 
754
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">DefaultDict</code><span class="sig-paren">(</span><em>collections.defaultdict, MutableMapping[KT, VT]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.DefaultDict" title="Permalink to this definition">¶</a></dt>
 
755
<dd><p>A generic version of <a class="reference internal" href="collections.html#collections.defaultdict" title="collections.defaultdict"><code class="xref py py-class docutils literal"><span class="pre">collections.defaultdict</span></code></a></p>
 
756
</dd></dl>
 
757
 
 
758
<dl class="class">
 
759
<dt id="typing.Generator">
 
760
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Generator</code><span class="sig-paren">(</span><em>Iterator[T_co], Generic[T_co, T_contra, V_co]</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.Generator" title="Permalink to this definition">¶</a></dt>
 
761
<dd><p>A generator can be annotated by the generic type
 
762
<code class="docutils literal"><span class="pre">Generator[YieldType,</span> <span class="pre">SendType,</span> <span class="pre">ReturnType]</span></code>. For example:</p>
 
763
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">echo_round</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
 
764
    <span class="n">sent</span> <span class="o">=</span> <span class="k">yield</span> <span class="mi">0</span>
 
765
    <span class="k">while</span> <span class="n">sent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
 
766
        <span class="n">sent</span> <span class="o">=</span> <span class="k">yield</span> <span class="nb">round</span><span class="p">(</span><span class="n">sent</span><span class="p">)</span>
 
767
    <span class="k">return</span> <span class="s1">&#39;Done&#39;</span>
 
768
</pre></div>
 
769
</div>
 
770
<p>Note that unlike many other generics in the typing module, the <code class="docutils literal"><span class="pre">SendType</span></code>
 
771
of <a class="reference internal" href="#typing.Generator" title="typing.Generator"><code class="xref py py-class docutils literal"><span class="pre">Generator</span></code></a> behaves contravariantly, not covariantly or
 
772
invariantly.</p>
 
773
<p>If your generator will only yield values, set the <code class="docutils literal"><span class="pre">SendType</span></code> and
 
774
<code class="docutils literal"><span class="pre">ReturnType</span></code> to <code class="docutils literal"><span class="pre">None</span></code>:</p>
 
775
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">infinite_stream</span><span class="p">(</span><span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Generator</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">]:</span>
 
776
    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
 
777
        <span class="k">yield</span> <span class="n">start</span>
 
778
        <span class="n">start</span> <span class="o">+=</span> <span class="mi">1</span>
 
779
</pre></div>
 
780
</div>
 
781
<p>Alternatively, annotate your generator as having a return type of
 
782
either <code class="docutils literal"><span class="pre">Iterable[YieldType]</span></code> or <code class="docutils literal"><span class="pre">Iterator[YieldType]</span></code>:</p>
 
783
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">infinite_stream</span><span class="p">(</span><span class="n">start</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
 
784
    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
 
785
        <span class="k">yield</span> <span class="n">start</span>
 
786
        <span class="n">start</span> <span class="o">+=</span> <span class="mi">1</span>
 
787
</pre></div>
 
788
</div>
 
789
</dd></dl>
 
790
 
 
791
<dl class="class">
 
792
<dt id="typing.Text">
 
793
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">Text</code><a class="headerlink" href="#typing.Text" title="Permalink to this definition">¶</a></dt>
 
794
<dd><p><code class="docutils literal"><span class="pre">Text</span></code> is an alias for <code class="docutils literal"><span class="pre">str</span></code>. It is provided to supply a forward
 
795
compatible path for Python 2 code: in Python 2, <code class="docutils literal"><span class="pre">Text</span></code> is an alias for
 
796
<code class="docutils literal"><span class="pre">unicode</span></code>.</p>
 
797
<p>Use <code class="docutils literal"><span class="pre">Text</span></code> to indicate that a value must contain a unicode string in
 
798
a manner that is compatible with both Python 2 and Python 3:</p>
 
799
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">add_unicode_checkmark</span><span class="p">(</span><span class="n">text</span><span class="p">:</span> <span class="n">Text</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Text</span><span class="p">:</span>
 
800
    <span class="k">return</span> <span class="n">text</span> <span class="o">+</span> <span class="s1">u&#39; </span><span class="se">\u2713</span><span class="s1">&#39;</span>
 
801
</pre></div>
 
802
</div>
 
803
</dd></dl>
 
804
 
 
805
<dl class="class">
 
806
<dt id="typing.io">
 
807
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">io</code><a class="headerlink" href="#typing.io" title="Permalink to this definition">¶</a></dt>
 
808
<dd><p>Wrapper namespace for I/O stream types.</p>
 
809
<p>This defines the generic type <code class="docutils literal"><span class="pre">IO[AnyStr]</span></code> and aliases <code class="docutils literal"><span class="pre">TextIO</span></code>
 
810
and <code class="docutils literal"><span class="pre">BinaryIO</span></code> for respectively <code class="docutils literal"><span class="pre">IO[str]</span></code> and <code class="docutils literal"><span class="pre">IO[bytes]</span></code>.
 
811
These representing the types of I/O streams such as returned by
 
812
<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>.</p>
 
813
</dd></dl>
 
814
 
 
815
<dl class="class">
 
816
<dt id="typing.re">
 
817
<em class="property">class </em><code class="descclassname">typing.</code><code class="descname">re</code><a class="headerlink" href="#typing.re" title="Permalink to this definition">¶</a></dt>
 
818
<dd><p>Wrapper namespace for regular expression matching types.</p>
 
819
<p>This defines the type aliases <code class="docutils literal"><span class="pre">Pattern</span></code> and <code class="docutils literal"><span class="pre">Match</span></code> which
 
820
correspond to the return types from <a class="reference internal" href="re.html#re.compile" title="re.compile"><code class="xref py py-func docutils literal"><span class="pre">re.compile()</span></code></a> and
 
821
<a class="reference internal" href="re.html#re.match" title="re.match"><code class="xref py py-func docutils literal"><span class="pre">re.match()</span></code></a>.  These types (and the corresponding functions)
 
822
are generic in <code class="docutils literal"><span class="pre">AnyStr</span></code> and can be made specific by writing
 
823
<code class="docutils literal"><span class="pre">Pattern[str]</span></code>, <code class="docutils literal"><span class="pre">Pattern[bytes]</span></code>, <code class="docutils literal"><span class="pre">Match[str]</span></code>, or
 
824
<code class="docutils literal"><span class="pre">Match[bytes]</span></code>.</p>
 
825
</dd></dl>
 
826
 
 
827
<dl class="function">
 
828
<dt id="typing.NamedTuple">
 
829
<code class="descclassname">typing.</code><code class="descname">NamedTuple</code><span class="sig-paren">(</span><em>typename</em>, <em>fields</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.NamedTuple" title="Permalink to this definition">¶</a></dt>
 
830
<dd><p>Typed version of namedtuple.</p>
 
831
<p>Usage:</p>
 
832
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Employee</span> <span class="o">=</span> <span class="n">typing</span><span class="o">.</span><span class="n">NamedTuple</span><span class="p">(</span><span class="s1">&#39;Employee&#39;</span><span class="p">,</span> <span class="p">[(</span><span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;id&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)])</span>
 
833
</pre></div>
 
834
</div>
 
835
<p>This is equivalent to:</p>
 
836
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Employee</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">namedtuple</span><span class="p">(</span><span class="s1">&#39;Employee&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="s1">&#39;id&#39;</span><span class="p">])</span>
 
837
</pre></div>
 
838
</div>
 
839
<p>The resulting class has one extra attribute: _field_types,
 
840
giving a dict mapping field names to types.  (The field names
 
841
are in the _fields attribute, which is part of the namedtuple
 
842
API.)</p>
 
843
</dd></dl>
 
844
 
 
845
<dl class="function">
 
846
<dt id="typing.NewType">
 
847
<code class="descclassname">typing.</code><code class="descname">NewType</code><span class="sig-paren">(</span><em>typ</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.NewType" title="Permalink to this definition">¶</a></dt>
 
848
<dd><p>A helper function to indicate a distinct types to a typechecker,
 
849
see <a class="reference internal" href="#distinct"><span>NewType</span></a>. At runtime it returns a function that returns
 
850
its argument. Usage:</p>
 
851
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">UserId</span> <span class="o">=</span> <span class="n">NewType</span><span class="p">(</span><span class="s1">&#39;UserId&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
 
852
<span class="n">first_user</span> <span class="o">=</span> <span class="n">UserId</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
 
853
</pre></div>
 
854
</div>
 
855
</dd></dl>
 
856
 
 
857
<dl class="function">
 
858
<dt id="typing.cast">
 
859
<code class="descclassname">typing.</code><code class="descname">cast</code><span class="sig-paren">(</span><em>typ</em>, <em>val</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.cast" title="Permalink to this definition">¶</a></dt>
 
860
<dd><p>Cast a value to a type.</p>
 
861
<p>This returns the value unchanged.  To the type checker this
 
862
signals that the return value has the designated type, but at
 
863
runtime we intentionally don&#8217;t check anything (we want this
 
864
to be as fast as possible).</p>
 
865
</dd></dl>
 
866
 
 
867
<dl class="function">
 
868
<dt id="typing.get_type_hints">
 
869
<code class="descclassname">typing.</code><code class="descname">get_type_hints</code><span class="sig-paren">(</span><em>obj</em><span class="optional">[</span>, <em>globals</em><span class="optional">[</span>, <em>locals</em><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span><a class="headerlink" href="#typing.get_type_hints" title="Permalink to this definition">¶</a></dt>
 
870
<dd><p>Return a dictionary containing type hints for a function, method, module
 
871
or class object.</p>
 
872
<p>This is often the same as <code class="docutils literal"><span class="pre">obj.__annotations__</span></code>. In addition,
 
873
forward references encoded as string literals are handled by evaluating
 
874
them in <code class="docutils literal"><span class="pre">globals</span></code> and <code class="docutils literal"><span class="pre">locals</span></code> namespaces. If necessary,
 
875
<code class="docutils literal"><span class="pre">Optional[t]</span></code> is added for function and method annotations if a default
 
876
value equal to <code class="docutils literal"><span class="pre">None</span></code> is set. For a class <code class="docutils literal"><span class="pre">C</span></code>, return
 
877
a dictionary constructed by merging all the <code class="docutils literal"><span class="pre">__annotations__</span></code> along
 
878
<code class="docutils literal"><span class="pre">C.__mro__</span></code> in reverse order.</p>
 
879
</dd></dl>
 
880
 
 
881
<dl class="function">
 
882
<dt id="typing.overload">
 
883
<code class="descclassname">&#64;</code><code class="descclassname">typing.</code><code class="descname">overload</code><a class="headerlink" href="#typing.overload" title="Permalink to this definition">¶</a></dt>
 
884
<dd><p>The <code class="docutils literal"><span class="pre">&#64;overload</span></code> decorator allows describing functions and methods
 
885
that support multiple different combinations of argument types. A series
 
886
of <code class="docutils literal"><span class="pre">&#64;overload</span></code>-decorated definitions must be followed by exactly one
 
887
non-<code class="docutils literal"><span class="pre">&#64;overload</span></code>-decorated definition (for the same function/method).
 
888
The <code class="docutils literal"><span class="pre">&#64;overload</span></code>-decorated definitions are for the benefit of the
 
889
type checker only, since they will be overwritten by the
 
890
non-<code class="docutils literal"><span class="pre">&#64;overload</span></code>-decorated definition, while the latter is used at
 
891
runtime but should be ignored by a type checker.  At runtime, calling
 
892
a <code class="docutils literal"><span class="pre">&#64;overload</span></code>-decorated function directly will raise
 
893
<code class="docutils literal"><span class="pre">NotImplementedError</span></code>. An example of overload that gives a more
 
894
precise type than can be expressed using a union or a type variable:</p>
 
895
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="nd">@overload</span>
 
896
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">response</span><span class="p">:</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
 
897
    <span class="o">...</span>
 
898
<span class="nd">@overload</span>
 
899
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">response</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
 
900
    <span class="o">...</span>
 
901
<span class="nd">@overload</span>
 
902
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">response</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
 
903
    <span class="o">...</span>
 
904
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
 
905
    <span class="o">&lt;</span><span class="n">actual</span> <span class="n">implementation</span><span class="o">&gt;</span>
 
906
</pre></div>
 
907
</div>
 
908
<p>See <span class="target" id="index-7"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a> for details and comparison with other typing semantics.</p>
 
909
</dd></dl>
 
910
 
 
911
<dl class="function">
 
912
<dt id="typing.no_type_check">
 
913
<code class="descclassname">&#64;</code><code class="descclassname">typing.</code><code class="descname">no_type_check</code><span class="sig-paren">(</span><em>arg</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.no_type_check" title="Permalink to this definition">¶</a></dt>
 
914
<dd><p>Decorator to indicate that annotations are not type hints.</p>
 
915
<p>The argument must be a class or function; if it is a class, it
 
916
applies recursively to all methods defined in that class (but not
 
917
to methods defined in its superclasses or subclasses).</p>
 
918
<p>This mutates the function(s) in place.</p>
 
919
</dd></dl>
 
920
 
 
921
<dl class="function">
 
922
<dt id="typing.no_type_check_decorator">
 
923
<code class="descclassname">&#64;</code><code class="descclassname">typing.</code><code class="descname">no_type_check_decorator</code><span class="sig-paren">(</span><em>decorator</em><span class="sig-paren">)</span><a class="headerlink" href="#typing.no_type_check_decorator" title="Permalink to this definition">¶</a></dt>
 
924
<dd><p>Decorator to give another decorator the <a class="reference internal" href="#typing.no_type_check" title="typing.no_type_check"><code class="xref py py-func docutils literal"><span class="pre">no_type_check()</span></code></a> effect.</p>
 
925
<p>This wraps the decorator with something that wraps the decorated
 
926
function in <a class="reference internal" href="#typing.no_type_check" title="typing.no_type_check"><code class="xref py py-func docutils literal"><span class="pre">no_type_check()</span></code></a>.</p>
 
927
</dd></dl>
 
928
 
 
929
<dl class="data">
 
930
<dt id="typing.Any">
 
931
<code class="descclassname">typing.</code><code class="descname">Any</code><a class="headerlink" href="#typing.Any" title="Permalink to this definition">¶</a></dt>
 
932
<dd><p>Special type indicating an unconstrained type.</p>
 
933
<ul class="simple">
 
934
<li>Every type is compatible with <a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a>.</li>
 
935
<li><a class="reference internal" href="#typing.Any" title="typing.Any"><code class="xref py py-data docutils literal"><span class="pre">Any</span></code></a> is compatible with every type.</li>
 
936
</ul>
 
937
</dd></dl>
 
938
 
 
939
<dl class="data">
 
940
<dt id="typing.Union">
 
941
<code class="descclassname">typing.</code><code class="descname">Union</code><a class="headerlink" href="#typing.Union" title="Permalink to this definition">¶</a></dt>
 
942
<dd><p>Union type; <code class="docutils literal"><span class="pre">Union[X,</span> <span class="pre">Y]</span></code> means either X or Y.</p>
 
943
<p>To define a union, use e.g. <code class="docutils literal"><span class="pre">Union[int,</span> <span class="pre">str]</span></code>.  Details:</p>
 
944
<ul>
 
945
<li><p class="first">The arguments must be types and there must be at least one.</p>
 
946
</li>
 
947
<li><p class="first">Unions of unions are flattened, e.g.:</p>
 
948
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Union</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">],</span> <span class="nb">float</span><span class="p">]</span> <span class="o">==</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">float</span><span class="p">]</span>
 
949
</pre></div>
 
950
</div>
 
951
</li>
 
952
<li><p class="first">Unions of a single argument vanish, e.g.:</p>
 
953
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">==</span> <span class="nb">int</span>  <span class="c1"># The constructor actually returns int</span>
 
954
</pre></div>
 
955
</div>
 
956
</li>
 
957
<li><p class="first">Redundant arguments are skipped, e.g.:</p>
 
958
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">==</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
 
959
</pre></div>
 
960
</div>
 
961
</li>
 
962
<li><p class="first">When comparing unions, the argument order is ignored, e.g.:</p>
 
963
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">==</span> <span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span>
 
964
</pre></div>
 
965
</div>
 
966
</li>
 
967
<li><p class="first">When a class and its subclass are present, the former is skipped, e.g.:</p>
 
968
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">object</span><span class="p">]</span> <span class="o">==</span> <span class="nb">object</span>
 
969
</pre></div>
 
970
</div>
 
971
</li>
 
972
<li><p class="first">You cannot subclass or instantiate a union.</p>
 
973
</li>
 
974
<li><p class="first">You cannot write <code class="docutils literal"><span class="pre">Union[X][Y]</span></code>.</p>
 
975
</li>
 
976
<li><p class="first">You can use <code class="docutils literal"><span class="pre">Optional[X]</span></code> as a shorthand for <code class="docutils literal"><span class="pre">Union[X,</span> <span class="pre">None]</span></code>.</p>
 
977
</li>
 
978
</ul>
 
979
</dd></dl>
 
980
 
 
981
<dl class="data">
 
982
<dt id="typing.Optional">
 
983
<code class="descclassname">typing.</code><code class="descname">Optional</code><a class="headerlink" href="#typing.Optional" title="Permalink to this definition">¶</a></dt>
 
984
<dd><p>Optional type.</p>
 
985
<p><code class="docutils literal"><span class="pre">Optional[X]</span></code> is equivalent to <code class="docutils literal"><span class="pre">Union[X,</span> <span class="pre">None]</span></code>.</p>
 
986
<p>Note that this is not the same concept as an optional argument,
 
987
which is one that has a default.  An optional argument with a
 
988
default needn&#8217;t use the <code class="docutils literal"><span class="pre">Optional</span></code> qualifier on its type
 
989
annotation (although it is inferred if the default is <code class="docutils literal"><span class="pre">None</span></code>).
 
990
A mandatory argument may still have an <code class="docutils literal"><span class="pre">Optional</span></code> type if an
 
991
explicit value of <code class="docutils literal"><span class="pre">None</span></code> is allowed.</p>
 
992
</dd></dl>
 
993
 
 
994
<dl class="data">
 
995
<dt id="typing.Tuple">
 
996
<code class="descclassname">typing.</code><code class="descname">Tuple</code><a class="headerlink" href="#typing.Tuple" title="Permalink to this definition">¶</a></dt>
 
997
<dd><p>Tuple type; <code class="docutils literal"><span class="pre">Tuple[X,</span> <span class="pre">Y]</span></code> is the type of a tuple of two items
 
998
with the first item of type X and the second of type Y.</p>
 
999
<p>Example: <code class="docutils literal"><span class="pre">Tuple[T1,</span> <span class="pre">T2]</span></code> is a tuple of two elements corresponding
 
1000
to type variables T1 and T2.  <code class="docutils literal"><span class="pre">Tuple[int,</span> <span class="pre">float,</span> <span class="pre">str]</span></code> is a tuple
 
1001
of an int, a float and a string.</p>
 
1002
<p>To specify a variable-length tuple of homogeneous type,
 
1003
use literal ellipsis, e.g. <code class="docutils literal"><span class="pre">Tuple[int,</span> <span class="pre">...]</span></code>. A plain <a class="reference internal" href="#typing.Tuple" title="typing.Tuple"><code class="xref py py-data docutils literal"><span class="pre">Tuple</span></code></a>
 
1004
is equivalent to <code class="docutils literal"><span class="pre">Tuple[Any,</span> <span class="pre">...]</span></code>, and in turn to <a class="reference internal" href="stdtypes.html#tuple" title="tuple"><code class="xref py py-class docutils literal"><span class="pre">tuple</span></code></a>.</p>
 
1005
</dd></dl>
 
1006
 
 
1007
<dl class="data">
 
1008
<dt id="typing.Callable">
 
1009
<code class="descclassname">typing.</code><code class="descname">Callable</code><a class="headerlink" href="#typing.Callable" title="Permalink to this definition">¶</a></dt>
 
1010
<dd><p>Callable type; <code class="docutils literal"><span class="pre">Callable[[int],</span> <span class="pre">str]</span></code> is a function of (int) -&gt; str.</p>
 
1011
<p>The subscription syntax must always be used with exactly two
 
1012
values: the argument list and the return type.  The argument list
 
1013
must be a list of types or an ellipsis; the return type must be
 
1014
a single type.</p>
 
1015
<p>There is no syntax to indicate optional or keyword arguments;
 
1016
such function types are rarely used as callback types.
 
1017
<code class="docutils literal"><span class="pre">Callable[...,</span> <span class="pre">ReturnType]</span></code> (literal ellipsis) can be used to
 
1018
type hint a callable taking any number of arguments and returning
 
1019
<code class="docutils literal"><span class="pre">ReturnType</span></code>.  A plain <a class="reference internal" href="#typing.Callable" title="typing.Callable"><code class="xref py py-data docutils literal"><span class="pre">Callable</span></code></a> is equivalent to
 
1020
<code class="docutils literal"><span class="pre">Callable[...,</span> <span class="pre">Any]</span></code>, and in turn to
 
1021
<a class="reference internal" href="collections.abc.html#collections.abc.Callable" title="collections.abc.Callable"><code class="xref py py-class docutils literal"><span class="pre">collections.abc.Callable</span></code></a>.</p>
 
1022
</dd></dl>
 
1023
 
 
1024
<dl class="data">
 
1025
<dt id="typing.ClassVar">
 
1026
<code class="descclassname">typing.</code><code class="descname">ClassVar</code><a class="headerlink" href="#typing.ClassVar" title="Permalink to this definition">¶</a></dt>
 
1027
<dd><p>Special type construct to mark class variables.</p>
 
1028
<p>As introduced in <span class="target" id="index-8"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0526"><strong>PEP 526</strong></a>, a variable annotation wrapped in ClassVar
 
1029
indicates that a given attribute is intended to be used as a class variable
 
1030
and should not be set on instances of that class. Usage:</p>
 
1031
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Starship</span><span class="p">:</span>
 
1032
    <span class="n">stats</span> <span class="o">=</span> <span class="p">{}</span>  <span class="c1"># type: ClassVar[Dict[str, int]] # class variable</span>
 
1033
    <span class="n">damage</span> <span class="o">=</span> <span class="mi">10</span> <span class="c1"># type: int                      # instance variable</span>
 
1034
</pre></div>
 
1035
</div>
 
1036
<p><a class="reference internal" href="#typing.ClassVar" title="typing.ClassVar"><code class="xref py py-data docutils literal"><span class="pre">ClassVar</span></code></a> accepts only types and cannot be further subscribed.</p>
 
1037
<p><a class="reference internal" href="#typing.ClassVar" title="typing.ClassVar"><code class="xref py py-data docutils literal"><span class="pre">ClassVar</span></code></a> is not a class itself, and should not
 
1038
be used with <a class="reference internal" href="functions.html#isinstance" title="isinstance"><code class="xref py py-func docutils literal"><span class="pre">isinstance()</span></code></a> or <a class="reference internal" href="functions.html#issubclass" title="issubclass"><code class="xref py py-func docutils literal"><span class="pre">issubclass()</span></code></a>.
 
1039
Note that <a class="reference internal" href="#typing.ClassVar" title="typing.ClassVar"><code class="xref py py-data docutils literal"><span class="pre">ClassVar</span></code></a> does not change Python runtime behavior;
 
1040
it can be used by 3rd party type checkers, so that the following
 
1041
code might flagged as an error by those:</p>
 
1042
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="n">enterprise_d</span> <span class="o">=</span> <span class="n">Starship</span><span class="p">(</span><span class="mi">3000</span><span class="p">)</span>
 
1043
<span class="n">enterprise_d</span><span class="o">.</span><span class="n">stats</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># Error, setting class variable on instance</span>
 
1044
<span class="n">Starship</span><span class="o">.</span><span class="n">stats</span> <span class="o">=</span> <span class="p">{}</span>     <span class="c1"># This is OK</span>
 
1045
</pre></div>
 
1046
</div>
 
1047
<div class="versionadded">
 
1048
<p><span class="versionmodified">New in version 3.5.3.</span></p>
 
1049
</div>
 
1050
</dd></dl>
 
1051
 
 
1052
<dl class="data">
 
1053
<dt id="typing.AnyStr">
 
1054
<code class="descclassname">typing.</code><code class="descname">AnyStr</code><a class="headerlink" href="#typing.AnyStr" title="Permalink to this definition">¶</a></dt>
 
1055
<dd><p><code class="docutils literal"><span class="pre">AnyStr</span></code> is a type variable defined as
 
1056
<code class="docutils literal"><span class="pre">AnyStr</span> <span class="pre">=</span> <span class="pre">TypeVar('AnyStr',</span> <span class="pre">str,</span> <span class="pre">bytes)</span></code>.</p>
 
1057
<p>It is meant to be used for functions that may accept any kind of string
 
1058
without allowing different kinds of strings to mix. For example:</p>
 
1059
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">concat</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">AnyStr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AnyStr</span><span class="p">:</span>
 
1060
    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
 
1061
 
 
1062
<span class="n">concat</span><span class="p">(</span><span class="s2">u&quot;foo&quot;</span><span class="p">,</span> <span class="s2">u&quot;bar&quot;</span><span class="p">)</span>  <span class="c1"># Ok, output has type &#39;unicode&#39;</span>
 
1063
<span class="n">concat</span><span class="p">(</span><span class="n">b</span><span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="n">b</span><span class="s2">&quot;bar&quot;</span><span class="p">)</span>  <span class="c1"># Ok, output has type &#39;bytes&#39;</span>
 
1064
<span class="n">concat</span><span class="p">(</span><span class="s2">u&quot;foo&quot;</span><span class="p">,</span> <span class="n">b</span><span class="s2">&quot;bar&quot;</span><span class="p">)</span>  <span class="c1"># Error, cannot mix unicode and bytes</span>
 
1065
</pre></div>
 
1066
</div>
 
1067
</dd></dl>
 
1068
 
 
1069
<dl class="data">
 
1070
<dt id="typing.TYPE_CHECKING">
 
1071
<code class="descclassname">typing.</code><code class="descname">TYPE_CHECKING</code><a class="headerlink" href="#typing.TYPE_CHECKING" title="Permalink to this definition">¶</a></dt>
 
1072
<dd><p>A special constant that is assumed to be <code class="docutils literal"><span class="pre">True</span></code> by 3rd party static
 
1073
type checkers. It is <code class="docutils literal"><span class="pre">False</span></code> at runtime. Usage:</p>
 
1074
<div class="highlight-python3"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
 
1075
    <span class="kn">import</span> <span class="nn">expensive_mod</span>
 
1076
 
 
1077
<span class="k">def</span> <span class="nf">fun</span><span class="p">():</span>
 
1078
    <span class="n">local_var</span><span class="p">:</span> <span class="n">expensive_mod</span><span class="o">.</span><span class="n">some_type</span> <span class="o">=</span> <span class="n">other_fun</span><span class="p">()</span>
 
1079
</pre></div>
 
1080
</div>
 
1081
</dd></dl>
 
1082
 
 
1083
</div>
 
1084
</div>
 
1085
 
 
1086
 
 
1087
          </div>
 
1088
        </div>
 
1089
      </div>
 
1090
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
 
1091
        <div class="sphinxsidebarwrapper">
 
1092
  <h3><a href="../contents.html">Table Of Contents</a></h3>
 
1093
  <ul>
 
1094
<li><a class="reference internal" href="#">26.1. <code class="docutils literal"><span class="pre">typing</span></code> &#8212; Support for type hints</a><ul>
 
1095
<li><a class="reference internal" href="#type-aliases">26.1.1. Type aliases</a></li>
 
1096
<li><a class="reference internal" href="#newtype">26.1.2. NewType</a></li>
 
1097
<li><a class="reference internal" href="#callable">26.1.3. Callable</a></li>
 
1098
<li><a class="reference internal" href="#generics">26.1.4. Generics</a></li>
 
1099
<li><a class="reference internal" href="#user-defined-generic-types">26.1.5. User-defined generic types</a></li>
 
1100
<li><a class="reference internal" href="#the-any-type">26.1.6. The <code class="docutils literal"><span class="pre">Any</span></code> type</a></li>
 
1101
<li><a class="reference internal" href="#classes-functions-and-decorators">26.1.7. Classes, functions, and decorators</a></li>
 
1102
</ul>
 
1103
</li>
 
1104
</ul>
 
1105
 
 
1106
  <h4>Previous topic</h4>
 
1107
  <p class="topless"><a href="development.html"
 
1108
                        title="previous chapter">26. Development Tools</a></p>
 
1109
  <h4>Next topic</h4>
 
1110
  <p class="topless"><a href="pydoc.html"
 
1111
                        title="next chapter">26.2. <code class="docutils literal"><span class="pre">pydoc</span></code> &#8212; Documentation generator and online help system</a></p>
 
1112
  <div role="note" aria-label="source link">
 
1113
    <h3>This Page</h3>
 
1114
    <ul class="this-page-menu">
 
1115
      <li><a href="../bugs.html">Report a Bug</a></li>
 
1116
      <li><a href="../_sources/library/typing.txt"
 
1117
            rel="nofollow">Show Source</a></li>
 
1118
    </ul>
 
1119
  </div>
 
1120
        </div>
 
1121
      </div>
 
1122
      <div class="clearer"></div>
 
1123
    </div>  
 
1124
    <div class="related" role="navigation" aria-label="related navigation">
 
1125
      <h3>Navigation</h3>
 
1126
      <ul>
 
1127
        <li class="right" style="margin-right: 10px">
 
1128
          <a href="../genindex.html" title="General Index"
 
1129
             >index</a></li>
 
1130
        <li class="right" >
 
1131
          <a href="../py-modindex.html" title="Python Module Index"
 
1132
             >modules</a> |</li>
 
1133
        <li class="right" >
 
1134
          <a href="pydoc.html" title="26.2. pydoc — Documentation generator and online help system"
 
1135
             >next</a> |</li>
 
1136
        <li class="right" >
 
1137
          <a href="development.html" title="26. Development Tools"
 
1138
             >previous</a> |</li>
 
1139
        <li><img src="../_static/py.png" alt=""
 
1140
                 style="vertical-align: middle; margin-top: -1px"/></li>
 
1141
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
 
1142
        <li>
 
1143
          <span class="version_switcher_placeholder">3.5.2</span>
 
1144
          <a href="../index.html">Documentation </a> &raquo;
 
1145
        </li>
 
1146
 
 
1147
          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
 
1148
          <li class="nav-item nav-item-2"><a href="development.html" >26. Development Tools</a> &raquo;</li>
 
1149
    <li class="right">
 
1150
        
 
1151
 
 
1152
    <div class="inline-search" style="display: none" role="search">
 
1153
        <form class="inline-search" action="../search.html" method="get">
 
1154
          <input placeholder="Quick search" type="text" name="q" />
 
1155
          <input type="submit" value="Go" />
 
1156
          <input type="hidden" name="check_keywords" value="yes" />
 
1157
          <input type="hidden" name="area" value="default" />
 
1158
        </form>
 
1159
    </div>
 
1160
    <script type="text/javascript">$('.inline-search').show(0);</script>
 
1161
         |
 
1162
    </li>
 
1163
 
 
1164
      </ul>
 
1165
    </div>  
 
1166
    <div class="footer">
 
1167
    &copy; <a href="../copyright.html">Copyright</a> 2001-2016, Python Software Foundation.
 
1168
    <br />
 
1169
    The Python Software Foundation is a non-profit corporation.
 
1170
    <a href="https://www.python.org/psf/donations/">Please donate.</a>
 
1171
    <br />
 
1172
    Last updated on Nov 25, 2016.
 
1173
    <a href="../bugs.html">Found a bug</a>?
 
1174
    <br />
 
1175
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.3.3.
 
1176
    </div>
 
1177
 
 
1178
  </body>
 
1179
</html>
 
 
b'\\ No newline at end of file'