Py Click (8.0) flag_value 转换为 str

Py Click (8.0) flag_value gets converted to str

我已经使用 click 一段时间了,效果很好 美好的。今天我升级到版本 8.0.1 并注意到当一个人使用 flag_value 设置为 class 而不是实例的选项时, flag_value 被转换为字符串表示形式:

import click

@click.command()
@click.option("--yes", flag_value=int)
def test(yes):
    print("yes=", yes, "type(yes)=", type(yes))

if __name__ == "__main__":
    test()
$ test.py --yes
yes= <class 'int'> type(yes)= <class 'str'>

这种行为是故意的吗?如果是这样,为什么?我在更改日志中找不到与标志行为相关的任何内容。

这显然破坏了向后兼容性。在切换到 click 8.0 之前,它很好地返回了对象。

this PR更改了此行为。

看来本意是,既然参数的默认类型是字符串,那倒不如return一个。它是在 8.0 中随着 Major Semver 更改发布的,因此有一些潜在的重大更改警告。

您可以像这样模拟之前的行为:

import click

class StringOrTypeParamType(click.types.StringParamType):

    def convert(self, value, param, ctx):
        if isinstance(value, type):
            return value
        else:
            return super().convert(value, param, ctx)

@click.command()
@click.option("--yes", flag_value=int, type=StringOrTypeParamType())
def test(yes):
    print("yes=", yes, "type(yes)=", type(yes))