Releases: Borda/pyDeprecate
Support containing `kwargs` in target function
Expand usage of the target function has kwargs
and uses kwargs.get
.
class NewCls:
def __init__(self, c: float, d: str = "abc", **kwargs):
self.my_c = c
self.my_d = d
self.my_e = kwargs.get("e", 0.2)
class PastCls(NewCls):
@deprecated(target=NewCls, deprecated_in="0.2", remove_in="0.4")
def __init__(self, c: int, d: str = "efg", **kwargs):
pass
Thanks to @jungbaepark
Fixed `void` typing
Fixed typing for void
helper to by mypy compliment, see sample:
from deprecate import deprecated, void
@deprecated(...)
def depr_accuracy(preds: list, target: list, blabla: float) -> float:
# to stop complain your IDE about unused argument you can use void/empty function
return void(preds, target, blabla)
Conditional skip
Conditional skip
Conditional skip of which can be used for mapping between different target functions depending on additional input such as package version
from deprecate import deprecated
FAKE_VERSION = 1
def version_greater_1():
return FAKE_VERSION > 1
@deprecated(
True, "0.3", "0.6", args_mapping=dict(c1='nc1'), skip_if=version_greater_1
)
def skip_pow(base, c1: float = 1, nc1: float = 1) -> float:
return base**(c1 - nc1)
# call this function will raise deprecation warning
print(skip_pow(2, 3))
# change the fake versions
FAKE_VERSION = 2
# Will not raise any warning
print(skip_pow(2, 3))
This can be beneficial with multiple deprecation levels introduced earlier...
Improved self arg deprecations
Self argument mapping
We also support deprecation and argument mapping for the function itself:
from deprecate import deprecated
@deprecated(
# define as depreaction some self argument - mapping
target=True, args_mapping={'coef': 'new_coef'},
# common version info
deprecated_in="0.2", remove_in="0.4",
)
def any_pow(base: float, coef: float = 0, new_coef: float = 0) -> float:
"""My function with deprecated argument `coef` mapped to `new_coef`."""
return base ** new_coef
# call this function will raise deprecation warning:
# The `any_pow` uses deprecated arguments: `coef` -> `new_coef`.
# They were deprecated since v0.2 and will be removed in v0.4.
print(any_pow(2, 3))
Eventually, you can set multiple deprecation levels via chaining deprecation arguments as each could be deprecated in another version:
from deprecate import deprecated
@deprecated(
True, "0.3", "0.6", args_mapping=dict(c1='nc1'),
template_mgs="Depr: v%(deprecated_in)s rm v%(remove_in)s for args: %(argument_map)s."
)
@deprecated(
True, "0.4", "0.7", args_mapping=dict(nc1='nc2'),
template_mgs="Depr: v%(deprecated_in)s rm v%(remove_in)s for args: %(argument_map)s."
)
def any_pow(base, c1: float = 0, nc1: float = 0, nc2: float = 2) -> float:
return base ** nc2
# call this function will raise deprecation warning:
# DeprecationWarning('Depr: v0.3 rm v0.6 for args: `c1` -> `nc1`.')
# DeprecationWarning('Depr: v0.4 rm v0.7 for args: `nc1` -> `nc2`.')
print(any_pow(2, 3))
Allow infinite waring
Allow infinite waring raising.
from deprecate import deprecated
@deprecated(
target=None, deprecated_in="0.1", remove_in="0.5",
# number or warnings per lifetime (with -1 for always)
num_warns=5
)
def my_sum(a: int, b: int = 5) -> int:
"""My deprecated function which still has to have implementation."""
return a + b
# call this function will raise deprecation warning:
# The `my_sum` was deprecated since v0.1. It will be removed in v0.5.
print(my_sum(1, 2))
Initial release
Simple tooling for marking deprecated functions or classes and re-routing to the new successors' instance.
Overview
The common use-case is moving your functions across codebase or outsourcing some functionalities to new packages. For most of these cases, you want to hold some compatibility, so you cannot simply remove past function, and also for some time you want to warn users that functionality they have been using is moved and not it is deprecated in favor of another function (which shall be used instead) and soon it will be removed completely.
Another good aspect is to do not overwhelm a user with too many warnings, so per function/class, this warning is raised only N times in the preferable stream.
Installation
Simple installation from PyPI:
pip install pyDeprecate
Use-cases
The functionality is kept simple and all default shall be reasonable, but still, you can do extra customization such as:
- define user warning message and preferable stream
- extended argument mapping to target function/method
Simple function forwarding
It is very straight forward, you forward your function call to new function and all arguments are mapped:
def base_sum(a: int = 0, b: int = 3) -> int:
"""My new function anywhere in codebase or even other package."""
return a + b
# ---------------------------
from deprecate import deprecated
@deprecated(target=base_sum, deprecated_in="0.1", remove_in="0.5")
def depr_sum(a: int, b: int = 5) -> int:
"""
My deprecated function which now has empty body
as all calls are routed to the new function.
"""
pass # or you can just place docstring as one above
# call this function will raise deprecation warning:
# The `depr_sum` was deprecated since v0.1 in favor of `__main__.base_sum`.
# It will be removed in v0.5.
print(depr_sum(1, 2))