diff options
Diffstat (limited to 'decorator/documentation3.html')
-rw-r--r-- | decorator/documentation3.html | 87 |
1 files changed, 47 insertions, 40 deletions
diff --git a/decorator/documentation3.html b/decorator/documentation3.html index 2b41374..78ea3a1 100644 --- a/decorator/documentation3.html +++ b/decorator/documentation3.html @@ -369,48 +369,55 @@ function is called:</p> <p>Python 3 introduced the concept of <a class="reference external" href="http://www.python.org/dev/peps/pep-3107/">function annotations</a>,i.e. the ability to annotate the signature of a function with additional information, stored in a dictionary named <tt class="docutils literal"><span class="pre">__annotations__</span></tt>. The decorator module, -starting from release 3.3 is able to understand and to preserve the +starting from release 3.3, is able to understand and to preserve the annotations. Here is an example:</p> -<blockquote> -<pre class="doctest-block"> ->>> @trace -... def f(x: 'the first argument', y: 'default argument'=1, z=2, *args: -'varargs', **kw: 'kwargs'): -... pass -</pre> -<pre class="doctest-block"> ->>> from inspect import getfullargspec ->>> argspec = getfullargspec(f) ->>> argspec.args -['x', 'y', 'z'] ->>> argspec.varargs -'args' ->>> argspec.varkw -'kw' ->>> argspec.defaults -(1, 2) ->>> argspec.kwonlyargs -[] ->>> argspec.kwonlydefaults ->>> sorted(argspec.annotations.items()) -[('args', 'varargs'), ('kw', 'kwargs'), ('x', 'the first argument'), ('y', -'default argument')] -</pre> -</blockquote> +<div class="codeblock python"> +<div class="highlight"><pre><span class="o">>>></span> <span class="nd">@trace</span> +<span class="o">...</span> <span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="s">'the first argument'</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="s">'default argument'</span><span class="o">=</span><span class="mf">1</span><span class="p">,</span> <span class="n">z</span><span class="o">=</span><span class="mf">2</span><span class="p">,</span> +<span class="o">...</span> <span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="s">'varargs'</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">:</span> <span class="s">'kwargs'</span><span class="p">):</span> +<span class="o">...</span> <span class="k">pass</span> +</pre></div> + +</div> +<p>In order to introspect functions with annotations, one needs the +utility <tt class="docutils literal"><span class="pre">inspect.getfullargspec</span></tt>, new in Python 3:</p> +<div class="codeblock python"> +<div class="highlight"><pre><span class="o">>>></span> <span class="kn">from</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="n">getfullargspec</span> +<span class="o">>>></span> <span class="n">argspec</span> <span class="o">=</span> <span class="n">getfullargspec</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">args</span> +<span class="p">[</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'z'</span><span class="p">]</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">varargs</span> +<span class="s">'args'</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">varkw</span> +<span class="s">'kw'</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">defaults</span> +<span class="p">(</span><span class="mf">1</span><span class="p">,</span> <span class="mf">2</span><span class="p">)</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">kwonlyargs</span> +<span class="p">[]</span> +<span class="o">>>></span> <span class="n">argspec</span><span class="o">.</span><span class="n">kwonlydefaults</span> +<span class="o">>>></span> <span class="n">sorted</span><span class="p">(</span><span class="n">argspec</span><span class="o">.</span><span class="n">annotations</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> +<span class="p">[(</span><span class="s">'args'</span><span class="p">,</span> <span class="s">'varargs'</span><span class="p">),</span> <span class="p">(</span><span class="s">'kw'</span><span class="p">,</span> <span class="s">'kwargs'</span><span class="p">),</span> <span class="p">(</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'the first argument'</span><span class="p">),</span> <span class="p">(</span><span class="s">'y'</span><span class="p">,</span> +<span class="s">'default argument'</span><span class="p">)]</span> +</pre></div> + +</div> <p>You can also check that the <tt class="docutils literal"><span class="pre">__annotations__</span></tt> dictionary is preserved:</p> -<blockquote> -<pre class="doctest-block"> ->>> f.__annotations__ == f.undecorated.__annotations__ -True -</pre> -</blockquote> -<p>The two dictionaries are different objects, though:</p> -<blockquote> -<pre class="doctest-block"> ->>> id(f.__annotations__) != id(f.undecorated.__annotations__) -True -</pre> -</blockquote> +<div class="codeblock python"> +<div class="highlight"><pre><span class="o">>>></span> <span class="n">f</span><span class="o">.</span><span class="n">__annotations__</span> <span class="o">==</span> <span class="n">f</span><span class="o">.</span><span class="n">undecorated</span><span class="o">.</span><span class="n">__annotations__</span> +<span class="bp">True</span> +</pre></div> + +</div> +<p>The two dictionaries are different objects, though</p> +<div class="codeblock python"> +<div class="highlight"><pre><span class="o">>>></span> <span class="nb">id</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">__annotations__</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">id</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">undecorated</span><span class="o">.</span><span class="n">__annotations__</span><span class="p">)</span> +<span class="bp">True</span> +</pre></div> + +</div> +<p>since internally the decorator module creates an entirely new dictionary +(it is not simply attaching the <tt class="docutils literal"><span class="pre">__annotations__</span></tt> attribute to the new +function).</p> </div> <div class="section" id="decorator-is-a-decorator"> <h1><a class="toc-backref" href="#id10"><tt class="docutils literal"><span class="pre">decorator</span></tt> is a decorator</a></h1> |