<div dir="ltr">Many classes, functions, and modules are defined within the context of another class, function, or module thereby forming a mathematical forest of declarations.  It is possible to walk the descendants using __dict__ (for classes and modules), but not the ancestors.  I propose adding __parent__ that would be filled at the same time that __qualname__ is filled in.  One concrete use case for __parent__ is allowing a method decorator to call super, which is currently impossible because the class in which the method has been defined is not available to the decorator.  This way, one could write:<div><br></div><div><pre class="lang-py prettyprint prettyprinted" style="margin-bottom: 10px; padding: 5px; font-size: 14px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; overflow: auto; width: auto; max-height: 600px; word-wrap: normal; color: rgb(0, 0, 0); line-height: 17.8048000335693px; background: rgb(238, 238, 238);"><code style="font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; white-space: inherit; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">def</span><span class="pln" style="background: transparent;"> ensure_finished</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">iterator</span><span class="pun" style="background: transparent;">):</span><span class="pln" style="background: transparent;">
    </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">try</span><span class="pun" style="background: transparent;">:</span><span class="pln" style="background: transparent;">
        next</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">iterator</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">
    </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">except</span><span class="pln" style="background: transparent;"> </span><span class="typ" style="color: rgb(43, 145, 175); background: transparent;">StopIteration</span><span class="pun" style="background: transparent;">:</span><span class="pln" style="background: transparent;">
        </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">return</span><span class="pln" style="background: transparent;">
    </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">else</span><span class="pun" style="background: transparent;">:</span><span class="pln" style="background: transparent;">
        </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">raise</span><span class="pln" style="background: transparent;"> </span><span class="typ" style="color: rgb(43, 145, 175); background: transparent;">RuntimeError</span><span class="pln" style="background: transparent;">


</span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">def</span><span class="pln" style="background: transparent;"> derived_generator</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">method</span><span class="pun" style="background: transparent;">):</span><span class="pln" style="background: transparent;">
    </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">def</span><span class="pln" style="background: transparent;"> new_method</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">self</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> </span><span class="pun" style="background: transparent;">*</span><span class="pln" style="background: transparent;">args</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> </span><span class="pun" style="background: transparent;">**</span><span class="pln" style="background: transparent;">kwargs</span><span class="pun" style="background: transparent;">):</span><span class="pln" style="background: transparent;">
        x </span><span class="pun" style="background: transparent;">=</span><span class="pln" style="background: transparent;"> method</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">self</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> </span><span class="pun" style="background: transparent;">*</span><span class="pln" style="background: transparent;">args</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> </span><span class="pun" style="background: transparent;">**</span><span class="pln" style="background: transparent;">kwargs</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">
        y </span><span class="pun" style="background: transparent;">=</span><span class="pln" style="background: transparent;"> getattr</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">super</span><span class="pun" style="background: transparent;">(method.__parent__,</span><span class="pln" style="background: transparent;"> self</span><span class="pun" style="background: transparent;">),</span><span class="pln" style="background: transparent;"> method</span><span class="pun" style="background: transparent;">.</span><span class="pln" style="background: transparent;">__name__</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">\
            </span><span class="pun" style="background: transparent;">(*</span><span class="pln" style="background: transparent;">args</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> </span><span class="pun" style="background: transparent;">**</span><span class="pln" style="background: transparent;">kwargs</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">

        </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">for</span><span class="pln" style="background: transparent;"> a</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> b </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">in</span><span class="pln" style="background: transparent;"> zip</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">x</span><span class="pun" style="background: transparent;">,</span><span class="pln" style="background: transparent;"> y</span><span class="pun" style="background: transparent;">):</span><span class="pln" style="background: transparent;">
            </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">assert</span><span class="pln" style="background: transparent;"> a </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">is</span><span class="pln" style="background: transparent;"> </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">None</span><span class="pln" style="background: transparent;"> </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">and</span><span class="pln" style="background: transparent;"> b </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">is</span><span class="pln" style="background: transparent;"> </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">None</span><span class="pln" style="background: transparent;">
            </span><span class="kwd" style="color: rgb(0, 0, 139); background: transparent;">yield</span><span class="pln" style="background: transparent;">

        ensure_finished</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">x</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">
        ensure_finished</span><span class="pun" style="background: transparent;">(</span><span class="pln" style="background: transparent;">y</span><span class="pun" style="background: transparent;">)</span><span class="pln" style="background: transparent;">
</span></code></pre></div><div><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif">This is currently impossible to implement without restating the class name every time the decorator is used as far as I know.</font></div><div><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif"><br></font></div><div><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif">Best,</font></div><div><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif"><br></font></div><div><font face="Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif">Neil</font></div></div>