
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.