On Mon, Feb 13, 2017 at 11:50:09AM -0800, Matt Gilson wrote: > For whatever weight my opinion holds, I'm +0 on this one. In my > estimation, in an ideal world it seems like: > > class Foo(object): > def bar(self): > """Bar!""" > > > # Identical to: > > class Foo(object): pass > > def Foo.bar(self): > """Bar!""" > > But I think that's going to be hard to achieve given implicit binding of > `super` (as some have already mentioned) and more mind-bendingly when > user-defined metaclasses are in play.
I think that this is too high a bar to reach (pun not intended). A metaclass can do anything it likes to the methods in the class, and injecting a method after the class already exists is not necessarily the same as including it in the initial namespace argument passed to the metaclass. I think a more reasonable bar is to have def Foo.bar(self): ... equivalent to def bar(self): ... Foo.bar = bar # Foo is a class del bar except that the usual class magic like setting __qualname__, super() etc will work. That feels doable. For instances, the invariant should be slightly different: def bar(self): ... foo.bar = types.MethodType(bar, foo) # foo is an instance del bar > Indeed, with metaclasses, it seems > like it become impossible to actually guarantee the equality of the above > two blocks of code. Maybe the PEP writers are OK with that, but that > should be decided at the outset... Indeed. > Also note that if users start adopting this as their default mode of class > creation (rather than just *class extending*), code-folding in a lot of > IDEs won't handle it gracefully (at least not for quite a while). Why would people use this as the default mode of class creation? I mean, sure there's always that *one guy* who insists on their own weird idiosyncratic way of doing things. I know somebody who refuses to use for loops, and writes all his loops using while. But I can't see this becoming a widespread practice. We all have our quirks, but most of our quirks are not that quirky. -- Steve _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/