<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Feb 13, 2017 at 5:48 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"># the clean proposed way:<br>
def instance.method(self):  # or MyClass.method<br>
    ...<br><br>But I don't think that we can reasonably argue that the suggested syntax<br>
isn't a clear, non-trivial win over the status quo, not unless we're<br>
also going to argue that introducing decorator syntax was a waste of<br>
time.<br></blockquote><div><br></div><div>I argue it's not a win specifically because we HAVE decorators already.  My off-the-cuff `@attach_to(thing)` decorator factory missed some details one would want, I now recognize.  We might want to attach a `.__class__` attribute, futz with `.__qualname__` and a few other things Nick points to.  You've been spelling this as `@inject_method(Class)`.  </div><div><br></div><div>Apart from the name of the decorator, the idea of having a *uniform* syntax for "put the decoration" at the top because the function might be long" is an advantage.  I agree that decorators are just syntax sugar, of course.  But the new syntax sugar is just *too duplicative* of that we already have.</div><div><br></div><div>Moreover, I think your spelling of what it is sugar for is slightly off.  The `del method` at the end feels wrong to me.  Specifically, in the example I repeated of attaching callbacks, the reason I'd want a function defined outside any particular class (or instance) scope is because I might want to use the same function as a method of various classes.  An `attach_to()` decorator can leave the defined function untouched, and only muck with the version that gets attached.  Hence you can even chain decorators:</div><div><br></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">@attach_to(this_menu)</font></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">@attach_to(that_menu)</font></div></div></div><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">def callback(self, ...):</font></div><div><font face="monospace, monospace">    ...</font></div></div></div></blockquote><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Then later on:</div><div><br></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="gmail_extra"><div class="gmail_quote"><div><font face="monospace, monospace">yet_another_menu.callback = callback</font></div></div></div></blockquote><div class="gmail_extra"><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Keeping medicines from the bloodstreams of the sick; food <br>from the bellies of the hungry; books from the hands of the <br>uneducated; technology from the underdeveloped; and putting <br>advocates of freedom in prisons.  Intellectual property is<br>to the 21st century what the slave trade was to the 16th.<br></div>
</div></div>