A further point to Steve's example is that a proxy object like the one he
described would probably have to change its implementation ever so slightly
in order to work as expected in a multi-step lookup involving namespaces
(so that the `wrap` function is only applied to the final value at the end).

Probably something like this:

from types import NamespaceType  # similar to FunctionType

class proxy:
    ….
    def __getattr__(self, name):
        if isinstance(value := getattr(self.object, name), NamespaceType):
            return type(self)(value)  # create another proxy object for the
next lookup

         return wrap(value)

On Sun, May 2, 2021 at 10:45 AM Matt del Valle <matthew...@gmail.com> wrote:

> This shouldn't be a problem.
>
> For instance:
>
> class Wrapped:
>     namespace foo:
>         bar = True
>
> facade = proxy(Wrapped())
> facade.foo.bar  # True
>
> Basically, when you try to look up 'foo' on the proxy object, the
> '__getattr__' returns the namespace object, which then forwards on the
> second attribute lookup ('bar') to the 'Wrapped' class. It happens in two
> steps rather than one. So what actually gets looked up is
> vars(wrapped_instance)['foo.bar'], because the 'foo' object that is left
> behind by the namespace block forwards the attribute lookup on to the
> Wrapped class (while prepending itself to the dict lookup).
>
> Does that make sense?
>
> On Sun, May 2, 2021 at 10:30 AM Stestagg <stest...@gmail.com> wrote:
>
>>
>>
>> On Sun, 2 May 2021 at 00:57, Matt del Valle <matthew...@gmail.com> wrote:
>>
>>> Hi all!
>>>
>>> So this is a proposal for a new soft language keyword:
>>>
>>> namespace
>>>
>>> …
>>> - any name bound within the namespace block is bound in exactly the same
>>> way it would be bound if the namespace block were not there, except that
>>> the namespace's name and a dot are prepended to the key when being inserted
>>> into the module/class/locals dict.
>>>
>>
>> Sometimes it’s useful to write classes that are similar to:
>>
>> class proxy:
>>     ….
>>     def __getattr__(self, name):
>>          return wrap(getattr(self.object, name))
>>
>> How would this pattern interact with objects that use namespaces? I’m
>> guessing the interpreter wouldn’t know to call getattr with ‘ns.attr’
>> rather than just ‘ns’?
>>
>> Steve
>>
>>>
_______________________________________________
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/YSW5QQXTLMVFOJSKHPS7X27HPJUHBTLY/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to