返回介绍

升级到新版本

发布于 2025-05-06 21:24:12 字数 1796 浏览 0 评论 0 收藏

Click 尝试向后兼容的最高级别,但有时这并不完全可能。如果我们需要打破向后兼容性,本文档将向您提供有关如何正确升级或处理向后兼容性的信息。

升级到 3.2

Click3.2 必须对多命令执行两次更改,这是由 Click2 和 Click3 之间的更改触发的,其结果比预期的要大。

上下文调用

Click3.2 包含 Context.invoke() 与其他命令一起使用时的函数。这个函数的最初目的是调用另一个命令,就像它来自命令行一样,当它被传递给上下文对象而不是函数时。这种使用在以前的文档中只有一处记录,而在 API 文档中没有对这种方法的适当解释。

核心问题是,在 3.2 之前,这一呼吁违背了意图:

ctx.invoke(other_command, 'arg1', 'arg2')

这从未打算起作用,因为它不允许 Click 操作参数。考虑到这个模式从来没有被记录下来,而且是无意的,在错误修复版本中做出了改变这个行为的决定,然后它意外地传播,开发人员依赖它。

对上述命令的正确调用如下:

ctx.invoke(other_command, name_of_arg1='arg1', name_of_arg2='arg2')

这还允许我们修复此函数未正确处理默认值的问题。

多命令链接 API

Click3 介绍的多命令链接。这需要更改 Click 内部分派的方式。不幸的是,这个更改没有正确实现,并且似乎可以提供一个 API,它可以通知 super 命令将调用的所有子命令。

然而,这种假设并不适用于过去给出的一种 API 保证。因此,该功能已在 3.2 中删除,因为它已被破坏。而是 Context.invoked_subcommand 属性已还原。

如果您确实需要知道将调用哪些确切的命令,有不同的方法来处理这一问题。第一种方法是让子命令返回所有函数,然后调用 Context.resultcallback() .

升级到 2.0

click 2.0 有一个中断更改,即参数回调的签名。在 2.0 之前,回调是用 (ctx, value) 而现在 (ctx, param, value) . 这一变化是必要的,因为它使重新使用回调变得过于复杂。

要简化转换,Click 将仍然接受旧的回调。从 click 3.0 开始,它将向 stderr 发出警告,鼓励您升级。

如果要同时支持 click 1.0 和 click 2.0,可以制作一个简单的修饰器来调整签名:

import click
from functools import update_wrapper

def compatcallback(f):
    # Click 1.0 does not have a version string stored, so we need to
    # use getattr here to be safe.
    if getattr(click, '__version__', '0.0') >= '2.0':
        return f
    return update_wrapper(lambda ctx, value: f(ctx, None, value), f)

有了这个助手,你就可以这样写:

@compatcallback
def callback(ctx, param, value):
    return value.upper()

请注意,由于 click 1.0 没有传递参数,因此 param 这里的论点是 None ,因此兼容性回调无法使用该参数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。