[Python-ideas] Fwd: Define a method or function attributeoutsideof a class with the dot operator

Steven D'Aprano steve at pearwood.info
Mon Feb 13 19:44:14 EST 2017


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


More information about the Python-ideas mailing list