如何在Python Click模块中实现命令后可传参的多命令行工具?
实现带全局选项和多命令的Click工具
看起来你已经有了一个不错的开头,不过目前代码里有几个小问题需要调整——比如命令函数无法获取全局的removedigits选项值,还有第三个命令没实现。我帮你完善了代码,同时补上了对应的功能逻辑:
import click @click.group() @click.option('--removedigits/--removenodigits', default=False, help="To remove digits or not") def cli(removedigits): # 这里可以添加全局初始化逻辑,如果需要的话 pass def process_input(args, remove_digits, transform_func): """通用处理函数:统一处理参数的数字移除和格式转换""" processed_args = [] for arg in args: if remove_digits: # 过滤掉字符串中的数字字符 cleaned_arg = ''.join([c for c in arg if not c.isdigit()]) processed_args.append(transform_func(cleaned_arg)) else: processed_args.append(transform_func(arg)) return processed_args @cli.command('uppercase') @click.argument('arguments', nargs=-1) @click.pass_context def uppercase_cmd(ctx, arguments): """将输入参数转换为大写(支持移除数字)""" # 通过上下文获取全局选项的配置值 result = process_input(arguments, ctx.parent.params['removedigits'], str.upper) click.echo(' '.join(result)) @cli.command('lowercase') @click.argument('arguments', nargs=-1) @click.pass_context def lowercase_cmd(ctx, arguments): """将输入参数转换为小写(支持移除数字)""" result = process_input(arguments, ctx.parent.params['removedigits'], str.lower) click.echo(' '.join(result)) @cli.command('capitalize') @click.argument('arguments', nargs=-1) @click.pass_context def capitalize_cmd(ctx, arguments): """将输入参数每个单词首字母大写(支持移除数字)""" result = process_input(arguments, ctx.parent.params['removedigits'], str.capitalize) click.echo(' '.join(result)) if __name__ == '__main__': cli()
关键调整说明:
- 全局选项传递:用
@click.pass_context装饰命令函数,通过ctx.parent.params['removedigits']拿到全局选项的配置,让每个命令都能复用这个设置。 - 代码复用:提取了
process_input通用函数,避免三个命令写重复的逻辑,统一处理数字移除和格式转换。 - 命令可读性:把原来模糊的
processor、processor1改成了语义明确的函数名,后续维护更方便。 - 补全第三个命令:新增了
capitalize命令,满足你三个命令的需求。
使用示例:
- 转大写并移除数字:
python your_script.py --removedigits uppercase Hello123 World456
输出:HELLO WORLD
- 转小写保留数字:
python your_script.py --removenodigits lowercase Hello123 World456
输出:hello123 world456
- 首字母大写:
python your_script.py capitalize hello world 789test
输出:Hello World 789Test
内容的提问来源于stack exchange,提问作者user6212058
相关产品推荐
相关产品推荐

