(original) (raw)
On 15 November 2017 at 08:43, Serhiy Storchaka <storchaka@gmail.com> wrote:
14.11.17 22:34, Ivan Levkivskyi пише:
This function will be called only if \`\`name\`\` is not found in the module
through the normal attribute lookup.
It is worth to mention that using name as a module global will bypass \_\_getattr\_\_. And this is intentional, otherwise calling \_\_getattr\_\_ for builtins will harm a performance.
Good point!
Backwards compatibility and impact on performance
\=================================================
What is affect on pydoc, word completion, inspect, pkgutil, unittest?
This is rather gray area. I am not sure that we need to update them in any way, just the people who use \_\_getattr\_\_ should be aware that
some tools might not yet expect it. I will add a note to the PEP about this.
def keep\_pickleable(func):
func.\_\_name\_\_ = func.\_\_name\_\_.replace('\_deprecated\_', '')
func.\_\_qualname\_\_ = func.\_\_qualname\_\_.replace('\_deprecated\_', '')
return func
@keep\_pickleable
def \_deprecated\_old\_function(arg, other):
...
I would create more standard helpers (for deprecation, for lazy importing). This feature is helpful not by itself, but because it will be used for implementing new features. Using \_\_getattr\_\_ directly will need to write a boilerplate code. Maybe when implementing these helper you will discover that this PEP needs some additions.
But in which module these helpers should live?
--
Ivan