summaryrefslogtreecommitdiff
path: root/logilab/common/deprecation.py
diff options
context:
space:
mode:
Diffstat (limited to 'logilab/common/deprecation.py')
-rw-r--r--logilab/common/deprecation.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/logilab/common/deprecation.py b/logilab/common/deprecation.py
index d45424d..577aee7 100644
--- a/logilab/common/deprecation.py
+++ b/logilab/common/deprecation.py
@@ -235,6 +235,39 @@ def attribute_renamed(old_name, new_name):
return _class_wrap
+def argument_renamed(old_name, new_name):
+ """
+ callable decorator to allow getting backward compatibility for renamed keyword arguments.
+
+ >>> @argument_renamed(old_name="old", new_name="new")
+ ... def some_function(new):
+ ... return new
+ >>> some_function(old=42)
+ sample.py:15: DeprecationWarning: argument old of callable some_function has been renamed and is deprecated, use keyword argument new instead
+ some_function(old=42)
+ 42
+ """
+ def _wrap(func):
+ @wraps(func)
+ def check_kwargs(*args, **kwargs):
+ if old_name in kwargs and new_name in kwargs:
+ raise ValueError(f"argument {old_name} of callable {func.__name__} has been "
+ f"renamed to {new_name} but you are both using {old_name} and "
+ f"{new_name} has keyword arguments, only uses {new_name}")
+
+ if old_name in kwargs:
+ warn(f"argument {old_name} of callable {func.__name__} has been renamed and is "
+ f"deprecated, use keyword argument {new_name} instead", stacklevel=2)
+ kwargs[new_name] = kwargs[old_name]
+ del kwargs[old_name]
+
+ return func(*args, **kwargs)
+
+ return check_kwargs
+
+ return _wrap
+
+
def renamed(old_name, new_function):
"""use to tell that a callable has been renamed.