弃用#
Conda 遵守 CEP-9 中定义的弃用时间表。为了尽可能使弃用变得简单明了,我们提供了一些辅助装饰器和函数来帮助完成正确的弃用流程。
函数、方法、属性和类#
警告
要弃用枚举,请将它们视为常量(参见 常量和枚举)。
最简单的用例是弃用任何函数、方法或属性
from conda.deprecations import deprecated
@deprecated("23.9", "24.3")
def bar():
...
>>> import foo
>>> foo.bar()
<stdin>:1: PendingDeprecationWarning: foo.bar is pending deprecation and will be removed in 24.3.
作为最低要求,我们必须始终指定两个版本
未来弃用版本,其中函数、方法或属性将被标记为弃用;在此之前,该功能将显示为待弃用(我们将其视为评论期),以及
随后的弃用版本,其中函数、方法或属性将从代码库中删除。
此外,您可以提供一个附录来告知用户应该做什么
from conda.deprecations import deprecated
@deprecated("23.9", "24.3", addendum="Use `qux` instead.")
def bar():
...
>>> import foo
>>> foo.bar()
<stdin>:1: PendingDeprecationWarning: foo.bar is pending deprecation and will be removed in 24.3. Use `qux` instead.
关键字参数#
警告
弃用或重命名位置参数会不必要地复杂,并且不受支持。相反,建议您 (1) 设计一种自定义方法来检测对弃用位置参数的使用(例如,类型检查)并使用 conda.deprecations.deprecated.topic
函数(参见 主题)或 (2) 弃用函数/方法本身并定义一个没有弃用参数的新函数/方法。
与弃用函数或方法类似,弃用关键字参数也很常见
from conda.deprecations import deprecated
# prior implementation
# def bar(is_true=True):
# ...
@deprecated.argument("23.9", "24.3", "is_true")
def bar():
...
>>> import foo
>>> foo.bar(is_true=True)
<stdin>:1: PendingDeprecationWarning: foo.bar(is_true) is pending deprecation and will be removed in 24.3.
或重命名关键字参数
from conda.deprecations import deprecated
# prior implementation
# def bar(is_true=True):
# ...
@deprecated.argument("23.9", "24.3", "is_true", rename="enabled")
def bar(enabled=True):
...
>>> import foo
>>> foo.bar(is_true=True)
<stdin>:1: PendingDeprecationWarning: foo.bar(is_true) is pending deprecation and will be removed in 24.3. Use 'enabled' instead.
argparse.Action
#
有时,需要弃用 CLI 参数。为此,我们提供了一个辅助函数来修补任何 argparse.Action
import argparse
from conda.deprecations import deprecated
parser = argparse.ArgumentParser()
parser.add_argument(
"--force",
dest="yes",
action=deprecated.action(
"23.9",
"24.3",
argparse._StoreTrueAction,
addendum="Use `--yes` instead.",
),
default=False,
)
parser.parse_args()
python foo.py --force
foo.py:16: PendingDeprecationWarning: `--force` is pending deprecation and will be removed in 24.3. Use `--yes` instead.
常量和枚举#
我们还提供了一种方法来弃用全局变量或常量
from conda.deprecations import deprecated
deprecated.constant("23.9", "24.3", "ULTIMATE_CONSTANT", 42)
>>> import foo
>>> foo.ULTIMATE_CONSTANT
<stdin>:1: PendingDeprecationWarning: foo.ULTIMATE_CONSTANT is pending deprecation and will be removed in 24.3.
枚举的工作方式类似
from enum import Enum
from conda.deprecations import deprecated
class Bar(Enum):
ULTIMATE_CONSTANT = 42
deprecated.constant("23.9", "24.3", "Bar", Bar)
del Bar
>>> from foo import Bar
<stdin>:1: PendingDeprecationWarning: foo.Bar is pending deprecation and will be removed in 24.3.
注意
常量弃用依赖于模块的 __getattr__
,该模块是在 PEP-562 中引入的。
模块#
整个模块也可以被弃用
from conda.deprecations import deprecated
deprecated.module("23.9", "24.3")
>>> import foo
<stdin>:1: PendingDeprecationWarning: foo is pending deprecation and will be removed in 24.3.
主题#
最后,代码执行还有很多其他方法也需要被弃用。为此,我们提供了一个通用弃用函数
from conda.deprecations import deprecated
def bar(...):
# some logic
if ...:
deprecated.topic("23.9", "24.3", topic="The <TOPIC>")
# some more logic
>>> import foo
>>> foo.bar(...)
<stdin>:1: PendingDeprecationWarning: The <TOPIC> is pending deprecation and will be removed in 24.3.