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))
我已经使用 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))