
On Fri, Sep 15, 2017 at 12:08 AM, Serhiy Storchaka <storchaka@gmail.com> wrote:
13.09.17 23:07, Lucas Wiman пише:
On Wed, Sep 13, 2017 at 11:55 AM, Serhiy Storchaka <storchaka@gmail.com <mailto:storchaka@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