python-peps/pep-0482/index.html

325 lines
21 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<title>PEP 482 Literature Overview for Type Hints | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0482/">
<link rel="stylesheet" href="../_static/style.css" type="text/css">
<link rel="stylesheet" href="../_static/mq.css" type="text/css">
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light">
<link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark">
<link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss">
<meta property="og:title" content='PEP 482 Literature Overview for Type Hints | peps.python.org'>
<meta property="og:description" content="This PEP is one of three related to type hinting. This PEP gives a literature overview of related work. The main spec is PEP 484.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0482/">
<meta property="og:site_name" content="Python Enhancement Proposals (PEPs)">
<meta property="og:image" content="https://peps.python.org/_static/og-image.png">
<meta property="og:image:alt" content="Python PEPs">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="description" content="This PEP is one of three related to type hinting. This PEP gives a literature overview of related work. The main spec is PEP 484.">
<meta name="theme-color" content="#3776ab">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all">
<title>Following system colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="9"></circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all">
<title>Selected dark colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all">
<title>Selected light colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
</svg>
<script>
document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto"
</script>
<section id="pep-page-section">
<header>
<h1>Python Enhancement Proposals</h1>
<ul class="breadcrumbs">
<li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> &raquo; </li>
<li><a href="../pep-0000/">PEP Index</a> &raquo; </li>
<li>PEP 482</li>
</ul>
<button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())">
<svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg>
<span class="visually-hidden">Toggle light / dark / auto colour theme</span>
</button>
</header>
<article>
<section id="pep-content">
<h1 class="page-title">PEP 482 Literature Overview for Type Hints</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">Łukasz Langa &lt;lukasz&#32;&#97;t&#32;python.org&gt;</dd>
<dt class="field-even">Discussions-To<span class="colon">:</span></dt>
<dd class="field-even"><a class="reference external" href="https://mail.python.org/archives/list/python-ideas&#64;python.org/">Python-Ideas list</a></dd>
<dt class="field-odd">Status<span class="colon">:</span></dt>
<dd class="field-odd"><abbr title="Accepted and implementation complete, or no longer active">Final</abbr></dd>
<dt class="field-even">Type<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Non-normative PEP containing background, guidelines or other information relevant to the Python ecosystem">Informational</abbr></dd>
<dt class="field-odd">Topic<span class="colon">:</span></dt>
<dd class="field-odd"><a class="reference external" href="../topic/typing/">Typing</a></dd>
<dt class="field-even">Created<span class="colon">:</span></dt>
<dd class="field-even">08-Jan-2015</dd>
<dt class="field-odd">Post-History<span class="colon">:</span></dt>
<dd class="field-odd"><p></p></dd>
</dl>
<hr class="docutils" />
<section id="contents">
<details><summary>Table of Contents</summary><ul class="simple">
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#existing-approaches-for-python">Existing Approaches for Python</a><ul>
<li><a class="reference internal" href="#mypy">mypy</a></li>
<li><a class="reference internal" href="#reticulated-python">Reticulated Python</a></li>
<li><a class="reference internal" href="#pycharm">PyCharm</a></li>
<li><a class="reference internal" href="#others">Others</a></li>
</ul>
</li>
<li><a class="reference internal" href="#existing-approaches-in-other-languages">Existing Approaches in Other Languages</a><ul>
<li><a class="reference internal" href="#actionscript">ActionScript</a></li>
<li><a class="reference internal" href="#dart">Dart</a></li>
<li><a class="reference internal" href="#hack">Hack</a></li>
<li><a class="reference internal" href="#typescript">TypeScript</a></li>
</ul>
</li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
</details></section>
<section id="abstract">
<h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2>
<p>This PEP is one of three related to type hinting. This PEP gives a
literature overview of related work. The main spec is <a class="pep reference internal" href="../pep-0484/" title="PEP 484 Type Hints">PEP 484</a>.</p>
</section>
<section id="existing-approaches-for-python">
<h2><a class="toc-backref" href="#existing-approaches-for-python" role="doc-backlink">Existing Approaches for Python</a></h2>
<section id="mypy">
<h3><a class="toc-backref" href="#mypy" role="doc-backlink">mypy</a></h3>
<p>(This section is a stub, since <a class="reference external" href="https://mypy-lang.org">mypy</a> is essentially what were
proposing.)</p>
</section>
<section id="reticulated-python">
<h3><a class="toc-backref" href="#reticulated-python" role="doc-backlink">Reticulated Python</a></h3>
<p><a class="reference external" href="https://github.com/mvitousek/reticulated">Reticulated Python</a> by Michael Vitousek is an example of
a slightly different approach to gradual typing for Python. It is
described in an actual <a class="reference external" href="http://wphomes.soic.indiana.edu/jsiek/files/2014/03/retic-python.pdf">academic paper</a> written by
Vitousek with Jeremy Siek and Jim Baker (the latter of Jython fame).</p>
</section>
<section id="pycharm">
<h3><a class="toc-backref" href="#pycharm" role="doc-backlink">PyCharm</a></h3>
<p>PyCharm by JetBrains has been providing a way to specify and check
types for about four years. The type system suggested by <a class="reference external" href="https://github.com/JetBrains/python-skeletons#types">PyCharm</a>
grew from simple class types to tuple types, generic types,
function types, etc. based on feedback of many users who shared their
experience of using type hints in their code.</p>
</section>
<section id="others">
<h3><a class="toc-backref" href="#others" role="doc-backlink">Others</a></h3>
<p>TBD: Add sections on <a class="reference external" href="https://github.com/pyflakes/pyflakes/">pyflakes</a>, <a class="reference external" href="https://www.pylint.org">pylint</a>, <a class="reference external" href="https://www.numpy.org">numpy</a>,
<a class="reference external" href="https://docs.python.org/3/howto/clinic.html">Argument Clinic</a>, <a class="reference external" href="https://github.com/google/pytypedecl">pytypedecl</a>, <a class="reference external" href="https://numba.pydata.org">numba</a>, <a class="reference external" href="https://pypi.org/project/obiwan">obiwan</a>.</p>
</section>
</section>
<section id="existing-approaches-in-other-languages">
<h2><a class="toc-backref" href="#existing-approaches-in-other-languages" role="doc-backlink">Existing Approaches in Other Languages</a></h2>
<section id="actionscript">
<h3><a class="toc-backref" href="#actionscript" role="doc-backlink">ActionScript</a></h3>
<p><a class="reference external" href="https://livedocs.adobe.com/specs/actionscript/3/">ActionScript</a> is a class-based, single inheritance,
object-oriented superset of ECMAScript. It supports interfaces and
strong runtime-checked static typing. Compilation supports a “strict
dialect” where type mismatches are reported at compile-time.</p>
<p>Example code with types:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">package</span> <span class="p">{</span>
<span class="kn">import</span> <span class="nn">flash.events.Event</span><span class="p">;</span>
<span class="n">public</span> <span class="k">class</span> <span class="nc">BounceEvent</span> <span class="n">extends</span> <span class="n">Event</span> <span class="p">{</span>
<span class="n">public</span> <span class="n">static</span> <span class="n">const</span> <span class="n">BOUNCE</span><span class="p">:</span><span class="n">String</span> <span class="o">=</span> <span class="s2">&quot;bounce&quot;</span><span class="p">;</span>
<span class="n">private</span> <span class="n">var</span> <span class="n">_side</span><span class="p">:</span><span class="n">String</span> <span class="o">=</span> <span class="s2">&quot;none&quot;</span><span class="p">;</span>
<span class="n">public</span> <span class="n">function</span> <span class="n">get</span> <span class="n">side</span><span class="p">():</span><span class="n">String</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">_side</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">function</span> <span class="n">BounceEvent</span><span class="p">(</span><span class="nb">type</span><span class="p">:</span><span class="n">String</span><span class="p">,</span> <span class="n">side</span><span class="p">:</span><span class="n">String</span><span class="p">){</span>
<span class="nb">super</span><span class="p">(</span><span class="nb">type</span><span class="p">,</span> <span class="n">true</span><span class="p">);</span>
<span class="n">_side</span> <span class="o">=</span> <span class="n">side</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">override</span> <span class="n">function</span> <span class="n">clone</span><span class="p">():</span><span class="n">Event</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">new</span> <span class="n">BounceEvent</span><span class="p">(</span><span class="nb">type</span><span class="p">,</span> <span class="n">_side</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="dart">
<h3><a class="toc-backref" href="#dart" role="doc-backlink">Dart</a></h3>
<p><a class="reference external" href="https://www.dartlang.org">Dart</a> is a class-based, single inheritance, object-oriented
language with C-style syntax. It supports interfaces, abstract classes,
reified generics, and optional typing.</p>
<p>Types are inferred when possible. The runtime differentiates between two
modes of execution: <em>checked mode</em> aimed for development (catching type
errors at runtime) and <em>production mode</em> recommended for speed execution
(ignoring types and asserts).</p>
<p>Example code with types:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Point</span> <span class="p">{</span>
<span class="n">final</span> <span class="n">num</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span>
<span class="n">Point</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">this</span><span class="o">.</span><span class="n">y</span><span class="p">);</span>
<span class="n">num</span> <span class="n">distanceTo</span><span class="p">(</span><span class="n">Point</span> <span class="n">other</span><span class="p">)</span> <span class="p">{</span>
<span class="n">var</span> <span class="n">dx</span> <span class="o">=</span> <span class="n">x</span> <span class="o">-</span> <span class="n">other</span><span class="o">.</span><span class="n">x</span><span class="p">;</span>
<span class="n">var</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">y</span> <span class="o">-</span> <span class="n">other</span><span class="o">.</span><span class="n">y</span><span class="p">;</span>
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">dx</span> <span class="o">*</span> <span class="n">dx</span> <span class="o">+</span> <span class="n">dy</span> <span class="o">*</span> <span class="n">dy</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="hack">
<h3><a class="toc-backref" href="#hack" role="doc-backlink">Hack</a></h3>
<p><a class="reference external" href="https://hacklang.org">Hack</a> is a programming language that interoperates seamlessly
with PHP. It provides opt-in static type checking, type aliasing,
generics, nullable types, and lambdas.</p>
<p>Example code with types:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>&lt;?hh
class MyClass {
private ?string $x = null;
public function alpha(): int {
return 1;
}
public function beta(): string {
return &#39;hi test&#39;;
}
}
function f(MyClass $my_inst): string {
// Will generate a hh_client error
return $my_inst-&gt;alpha();
}
</pre></div>
</div>
</section>
<section id="typescript">
<h3><a class="toc-backref" href="#typescript" role="doc-backlink">TypeScript</a></h3>
<p><a class="reference external" href="http://www.typescriptlang.org">TypeScript</a> is a typed superset of JavaScript that adds
interfaces, classes, mixins and modules to the language.</p>
<p>Type checks are duck typed. Multiple valid function signatures are
specified by supplying overloaded function declarations. Functions and
classes can use generics as type parameterization. Interfaces can have
optional fields. Interfaces can specify array and dictionary types.
Classes can have constructors that implicitly add arguments as fields.
Classes can have static fields. Classes can have private fields.
Classes can have getters/setters for fields (like property). Types are
inferred.</p>
<p>Example code with types:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">interface</span> <span class="n">Drivable</span> <span class="p">{</span>
<span class="n">start</span><span class="p">():</span> <span class="n">void</span><span class="p">;</span>
<span class="n">drive</span><span class="p">(</span><span class="n">distance</span><span class="p">:</span> <span class="n">number</span><span class="p">):</span> <span class="n">boolean</span><span class="p">;</span>
<span class="n">getPosition</span><span class="p">():</span> <span class="n">number</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">class</span> <span class="nc">Car</span> <span class="n">implements</span> <span class="n">Drivable</span> <span class="p">{</span>
<span class="n">private</span> <span class="n">_isRunning</span><span class="p">:</span> <span class="n">boolean</span><span class="p">;</span>
<span class="n">private</span> <span class="n">_distanceFromStart</span><span class="p">:</span> <span class="n">number</span><span class="p">;</span>
<span class="n">constructor</span><span class="p">()</span> <span class="p">{</span>
<span class="n">this</span><span class="o">.</span><span class="n">_isRunning</span> <span class="o">=</span> <span class="n">false</span><span class="p">;</span>
<span class="n">this</span><span class="o">.</span><span class="n">_distanceFromStart</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">start</span><span class="p">()</span> <span class="p">{</span>
<span class="n">this</span><span class="o">.</span><span class="n">_isRunning</span> <span class="o">=</span> <span class="n">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">drive</span><span class="p">(</span><span class="n">distance</span><span class="p">:</span> <span class="n">number</span><span class="p">):</span> <span class="n">boolean</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">_isRunning</span><span class="p">)</span> <span class="p">{</span>
<span class="n">this</span><span class="o">.</span><span class="n">_distanceFromStart</span> <span class="o">+=</span> <span class="n">distance</span><span class="p">;</span>
<span class="k">return</span> <span class="n">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">public</span> <span class="n">getPosition</span><span class="p">():</span> <span class="n">number</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">this</span><span class="o">.</span><span class="n">_distanceFromStart</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0482.rst">https://github.com/python/peps/blob/main/peps/pep-0482.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0482.rst">2024-08-20 10:29:32 GMT</a></p>
</article>
<nav id="pep-sidebar">
<h2>Contents</h2>
<ul>
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#existing-approaches-for-python">Existing Approaches for Python</a><ul>
<li><a class="reference internal" href="#mypy">mypy</a></li>
<li><a class="reference internal" href="#reticulated-python">Reticulated Python</a></li>
<li><a class="reference internal" href="#pycharm">PyCharm</a></li>
<li><a class="reference internal" href="#others">Others</a></li>
</ul>
</li>
<li><a class="reference internal" href="#existing-approaches-in-other-languages">Existing Approaches in Other Languages</a><ul>
<li><a class="reference internal" href="#actionscript">ActionScript</a></li>
<li><a class="reference internal" href="#dart">Dart</a></li>
<li><a class="reference internal" href="#hack">Hack</a></li>
<li><a class="reference internal" href="#typescript">TypeScript</a></li>
</ul>
</li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
<br>
<a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0482.rst">Page Source (GitHub)</a>
</nav>
</section>
<script src="../_static/colour_scheme.js"></script>
<script src="../_static/wrap_tables.js"></script>
<script src="../_static/sticky_banner.js"></script>
</body>
</html>