[Python-ideas] PEP 562

Serhiy Storchaka storchaka at gmail.com
Tue Nov 14 03:24:19 EST 2017


10.09.17 21:48, Ivan Levkivskyi пише:
>    # lib.py
> 
>    from warnings import warn
> 
>    deprecated_names = ["old_function", ...]
> 
>    def _deprecated_old_function(arg, other):
>        ...
> 
>    def __getattr__(name):
>        if name in deprecated_names:
>            warn(f"{name} is deprecated", DeprecationWarning)
>            return globals()[f"_deprecated_{name}"]
>        raise AttributeError(f"module {__name__} has no attribute {name}")
> 
>    # main.py
> 
>    from lib import old_function  # Works, but emits the warning

I think the PEP should provide better examples, because they will be 
copied in third-party code.

For keeping all functionality (in particularly be pickleable) the 
deprecated function should preserve its name.

    def old_function(arg, other):
        ...
    _deprecated_old_function = old_function
    del old_function

or

    def _deprecated_old_function(arg, other):
        ...
    _deprecated_old_function.__name__ = 'old_function'
    _deprecated_old_function.__qualname__ = 'old_function'

(I prefer the former variant.)

I'm wondering if it is worth to provide a special helper that will 
rename the deprecated function and create the corresponding __getattr__ 
function.

It could be possible to create helpers that implement module-level 
properties too.



More information about the Python-ideas mailing list