如何为Click类实现添加Option?触发TypeError报错求助
解决Click类实现中添加Option触发的TypeError问题
错误原因
直接在自定义Click Command类的__init__里添加click.Option时,如果没显式指定name参数,Click没法自动推断这个选项对应的上下文参数名,就会抛出TypeError: Could not determine name for option。而Argument能正常运行是因为位置参数的名称推断逻辑更直接,不需要额外配置。
两种解决方法
方法1:给Option显式指定name参数
在创建click.Option实例时,手动传入name参数,让它和你要在上下文里获取的参数名对应:
import click class MyCustomCommand(click.Command): def __init__(self): super().__init__(name="mycmd") # 显式指定name,和ctx.params里的键对应 test_option = click.Option(["--test", "-t"], name="test", default="default_val") self.params.append(test_option) def invoke(self, ctx): click.echo(f"获取到的test选项值:{ctx.params['test']}") if __name__ == "__main__": MyCustomCommand()()
方法2:用类装饰器+@click.option(推荐)
这种方式更符合Click的惯用写法,装饰器会自动处理选项名称的推断,不用手动指定:
import click class MyCustomCommand(click.Command): def invoke(self, ctx): click.echo(f"获取到的test选项值:{ctx.params['test']}") @click.command(cls=MyCustomCommand) @click.option("--test", "-t", default="default_val") def mycmd(test): # 这里的test参数会自动映射到ctx.params里,invoke方法可直接使用 pass if __name__ == "__main__": mycmd()
验证运行
不管用哪种方法,运行后执行python your_script.py --test hello,都会输出对应的选项值,不会再触发错误。
内容的提问来源于stack exchange,提问作者Jim Fell
相关产品推荐
相关产品推荐

