On Fri, Sep 15, 2017 at 12:08 AM, Serhiy Storchaka <storch...@gmail.com> wrote:
> 13.09.17 23:07, Lucas Wiman пише:
>>
>> On Wed, Sep 13, 2017 at 11:55 AM, Serhiy Storchaka <storch...@gmail.com
>> <mailto:storch...@gmail.com>> wrote:
>>
>>     [...] Calling __getattr__() will slow down the access to builtins.
>>     And there is a recursion problem if module's __getattr__() uses
>>     builtins.
>>
>>
>>   The first point is totally valid, but the recursion problem doesn't seem
>> like a strong argument. There are already lots of recursion problems when
>> defining custom __getattr__ or __getattribute__ methods, but on balance
>> they're a very useful part of the language.
>
>
> In normal classes we have the recursion problem in __getattr__() only with
> accessing instance attributes. Builtins (like isinstance, getattr,
> AttributeError) can be used without problems. In module's __getattr__() all
> this is a problem.
>
> Module attribute access can be implicit. For example comparing a string with
> a byte object in __getattr__() can trigger the lookup of __warningregistry__
> and the infinity recursion.

Crazy idea: Can we just isolate that function from its module?

def isolate(func):
    return type(func)(func.__code__, {"__builtins__": __builtins__},
func.__name__)

@isolate
def __getattr__(name):
    print("Looking up", name)
    # the lookup of 'print' will skip this module

ChrisA
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to