On Tue, Jun 22, 2021 at 9:56 PM Steven D'Aprano <st...@pearwood.info> wrote:
>
> On Tue, Jun 22, 2021 at 09:12:53PM +1000, Chris Angelico wrote:
>
> > > The must be no semantic difference between:
> > >
> > >     obj.method(arg)
> > >
> > > and
> > >
> > >     getattr(obj, 'method')(arg)
> > >
> > > regardless of whether `method` is a regular method or an extension
> > > method.
> >
> > And this is a problem.
>
> If its a problem for getattr, it is a problem for dot syntax, because
> they are essentially the same thing.

Ahh but that is precisely the problem.

> > How is getattr defined?
>
> The same as it is defined now, except with some minor tweaks to support
> extension methods.

Do those tweaks include reaching back into the module that called it?
How magical will it be?

> > Is it counted as being in the current module?
>
> `getattr`? No, that's a builtin. You can shadow it or delete it if you
> want, it's just a public API to the underlying functionality built
> into the interpreter. Dot syntax won't be affected.

Let me clarify then.

We shall assume for the moment that the builtins module does not have
any extension methods registered. (I suppose it could, but then you
get all the action-at-a-distance of monkey-patching AND the problems
of extension methods, so I would hope people don't do this.) This
means that the getattr() function, being a perfectly straight-forward
function, is not going to see any extension methods.

Okay then.

# whatever the actual syntax is
@extend(list)
def in_order(self):
    return sorted(self)

stuff = [1, 5, 2]
stuff.in_order() # == [1, 2, 5]
getattr(stuff, "in_order")() # AttributeError

Does the getattr function see the extension methods? If so, which? If
not, how can getattr return the same thing as attribute lookup does?

How do you inform getattr of which extension methods it should be looking at?

And what about this?

f = functools.partial(getattr, stuff)
f("in_order")

NOW which extension methods should apply? Those registered here? Those
registered in the builtins? Those registered in functools?

Yes, monkey-patching *is* cleaner, because the object is the same
object no matter how you look it up.

(Oh, and another wrinkle, although a small one: Code objects would
need to keep track of their modules. Currently functions do, but code
objects don't. But that seems unlikely to introduce further
complications.)

ChrisA
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/H5QSWNLWC4HOR3JPXBNDWCSE2QFHXPS6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to