Skip to content

Commit 96b57ff

Browse files
committed
deploy: 234cc4b
1 parent 231835e commit 96b57ff

File tree

5 files changed

+76
-11
lines changed

5 files changed

+76
-11
lines changed

_modules/plum/signature.html

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -477,16 +477,26 @@ <h1>Source code for plum.signature</h1><div class="highlight"><pre>
477477

478478
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
479479
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Signature</span><span class="p">):</span>
480+
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">varargs</span> <span class="ow">is</span> <span class="n">Missing</span><span class="p">:</span>
481+
<span class="n">self_varargs</span> <span class="o">=</span> <span class="n">Missing</span>
482+
<span class="k">else</span><span class="p">:</span>
483+
<span class="n">self_varargs</span> <span class="o">=</span> <span class="n">beartype</span><span class="o">.</span><span class="n">door</span><span class="o">.</span><span class="n">TypeHint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">varargs</span><span class="p">)</span>
484+
485+
<span class="k">if</span> <span class="n">other</span><span class="o">.</span><span class="n">varargs</span> <span class="ow">is</span> <span class="n">Missing</span><span class="p">:</span>
486+
<span class="n">other_varargs</span> <span class="o">=</span> <span class="n">Missing</span>
487+
<span class="k">else</span><span class="p">:</span>
488+
<span class="n">other_varargs</span> <span class="o">=</span> <span class="n">beartype</span><span class="o">.</span><span class="n">door</span><span class="o">.</span><span class="n">TypeHint</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">varargs</span><span class="p">)</span>
489+
490+
<span class="c1"># We don&#39;t need to check faithfulness, because that is automatically derived</span>
491+
<span class="c1"># from the arguments.</span>
480492
<span class="k">return</span> <span class="p">(</span>
481-
<span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">,</span>
482-
<span class="bp">self</span><span class="o">.</span><span class="n">varargs</span><span class="p">,</span>
493+
<span class="nb">tuple</span><span class="p">(</span><span class="n">beartype</span><span class="o">.</span><span class="n">door</span><span class="o">.</span><span class="n">TypeHint</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">types</span><span class="p">),</span>
494+
<span class="n">self_varargs</span><span class="p">,</span>
483495
<span class="bp">self</span><span class="o">.</span><span class="n">precedence</span><span class="p">,</span>
484-
<span class="bp">self</span><span class="o">.</span><span class="n">is_faithful</span><span class="p">,</span>
485496
<span class="p">)</span> <span class="o">==</span> <span class="p">(</span>
486-
<span class="n">other</span><span class="o">.</span><span class="n">types</span><span class="p">,</span>
487-
<span class="n">other</span><span class="o">.</span><span class="n">varargs</span><span class="p">,</span>
497+
<span class="nb">tuple</span><span class="p">(</span><span class="n">beartype</span><span class="o">.</span><span class="n">door</span><span class="o">.</span><span class="n">TypeHint</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">other</span><span class="o">.</span><span class="n">types</span><span class="p">),</span>
498+
<span class="n">other_varargs</span><span class="p">,</span>
488499
<span class="n">other</span><span class="o">.</span><span class="n">precedence</span><span class="p">,</span>
489-
<span class="n">other</span><span class="o">.</span><span class="n">is_faithful</span><span class="p">,</span>
490500
<span class="p">)</span>
491501
<span class="k">return</span> <span class="kc">False</span>
492502

_modules/plum/type.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ <h1>Source code for plum.type</h1><div class="highlight"><pre>
644644
<span class="c1"># counter-example, we will refine this logic.</span>
645645
<span class="k">return</span> <span class="kc">True</span>
646646
<span class="k">else</span><span class="p">:</span>
647-
<span class="k">if</span> <span class="n">origin</span> <span class="ow">in</span> <span class="p">{</span><span class="n">typing</span><span class="o">.</span><span class="n">Union</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">}:</span>
647+
<span class="k">if</span> <span class="n">origin</span> <span class="ow">in</span> <span class="p">{</span><span class="n">typing</span><span class="o">.</span><span class="n">Union</span><span class="p">,</span> <span class="n">UnionType</span><span class="p">,</span> <span class="n">typing</span><span class="o">.</span><span class="n">Optional</span><span class="p">}:</span>
648648
<span class="k">return</span> <span class="nb">all</span><span class="p">(</span><span class="n">is_faithful</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span><span class="p">)</span>
649649
<span class="k">else</span><span class="p">:</span>
650650
<span class="k">return</span> <span class="kc">False</span>

_sources/types.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,41 @@ def f(x: Dict[int, str]) -> str:
4848
return "dict of int to str"
4949
```
5050

51-
**Note:**
5251
Although parametric types such as `List[int]` and `Dict[int, str]` are fully
5352
supported, they do incur a performance penalty.
5453
For optimal performance, is recommended to use parametric types only where necessary.
5554
`Union` and `Optional` do not incur a performance penalty.
5655

56+
````{important}
57+
Plum's type system is powered by [Beartype](https://github.com/beartype/beartype).
58+
To ensure constant-time performance,
59+
Beartype checks the types of containers by checking the type of a random single element.
60+
This means that it is not safe to use containers with mixed element types!
61+
62+
```python
63+
from typing import List
64+
65+
from plum import dispatch
66+
67+
68+
@dispatch
69+
def f(x: List[int]) -> str:
70+
return "list of int"
71+
```
72+
73+
```
74+
>>> f([1, "1"]) # It might happen to check the first element.
75+
"list of int"
76+
77+
>>> f([1, "1"]) # Or it might check the second. :(
78+
NotFoundLookupError: `f([1, '1'])` could not be resolved.
79+
```
80+
81+
In the future, Beartype
82+
[will support exhaustive type checking](https://beartype.readthedocs.io/en/latest/api_decor/#beartype.BeartypeStrategy.On).
83+
Plum already opts into this behaviour and will use it once it becomes available.
84+
````
85+
5786
The type system is *covariant*, as opposed to Julia's type
5887
system, which is *invariant*.
5988
For example, this means that `List[T1]` is a subtype of `List[T2]` whenever

searchindex.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

types.html

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,11 +457,37 @@ <h1>Types<a class="headerlink" href="#types" title="Link to this heading">#</a><
457457
<span class="k">return</span> <span class="s2">&quot;dict of int to str&quot;</span>
458458
</pre></div>
459459
</div>
460-
<p><strong>Note:</strong>
461-
Although parametric types such as <code class="docutils literal notranslate"><span class="pre">List[int]</span></code> and <code class="docutils literal notranslate"><span class="pre">Dict[int,</span> <span class="pre">str]</span></code> are fully
460+
<p>Although parametric types such as <code class="docutils literal notranslate"><span class="pre">List[int]</span></code> and <code class="docutils literal notranslate"><span class="pre">Dict[int,</span> <span class="pre">str]</span></code> are fully
462461
supported, they do incur a performance penalty.
463462
For optimal performance, is recommended to use parametric types only where necessary.
464463
<code class="docutils literal notranslate"><span class="pre">Union</span></code> and <code class="docutils literal notranslate"><span class="pre">Optional</span></code> do not incur a performance penalty.</p>
464+
<div class="admonition important">
465+
<p class="admonition-title">Important</p>
466+
<p>Plum’s type system is powered by <a class="reference external" href="https://github.com/beartype/beartype">Beartype</a>.
467+
To ensure constant-time performance,
468+
Beartype checks the types of containers by checking the type of a random single element.
469+
This means that it is not safe to use containers with mixed element types!</p>
470+
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span>
471+
472+
<span class="kn">from</span><span class="w"> </span><span class="nn">plum</span><span class="w"> </span><span class="kn">import</span> <span class="n">dispatch</span>
473+
474+
475+
<span class="nd">@dispatch</span>
476+
<span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
477+
<span class="k">return</span> <span class="s2">&quot;list of int&quot;</span>
478+
</pre></div>
479+
</div>
480+
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">])</span> <span class="c1"># It might happen to check the first element.</span>
481+
<span class="go">&quot;list of int&quot;</span>
482+
483+
<span class="gp">&gt;&gt;&gt; </span><span class="n">f</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">])</span> <span class="c1"># Or it might check the second. :(</span>
484+
<span class="go">NotFoundLookupError: `f([1, &#39;1&#39;])` could not be resolved.</span>
485+
</pre></div>
486+
</div>
487+
<p>In the future, Beartype
488+
<a class="reference external" href="https://beartype.readthedocs.io/en/latest/api_decor/#beartype.BeartypeStrategy.On">will support exhaustive type checking</a>.
489+
Plum already opts into this behaviour and will use it once it becomes available.</p>
490+
</div>
465491
<p>The type system is <em>covariant</em>, as opposed to Julia’s type
466492
system, which is <em>invariant</em>.
467493
For example, this means that <code class="docutils literal notranslate"><span class="pre">List[T1]</span></code> is a subtype of <code class="docutils literal notranslate"><span class="pre">List[T2]</span></code> whenever

0 commit comments

Comments
 (0)