325 lines
21 KiB
HTML
325 lines
21 KiB
HTML
|
||
<!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> » </li>
|
||
<li><a href="../pep-0000/">PEP Index</a> » </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 <lukasz at python.org></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@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 we’re
|
||
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">"bounce"</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">"none"</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><?hh
|
||
class MyClass {
|
||
private ?string $x = null;
|
||
|
||
public function alpha(): int {
|
||
return 1;
|
||
}
|
||
|
||
public function beta(): string {
|
||
return 'hi test';
|
||
}
|
||
}
|
||
|
||
function f(MyClass $my_inst): string {
|
||
// Will generate a hh_client error
|
||
return $my_inst->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> |