如何让argparse中--serve选项接受两个不同类型的参数
实现argparse解析
--serve双参数的方案 可以实现,你之前的写法问题在于type参数不能接受元组来分别指定每个位置参数的类型——argparse的type是对nargs接收的所有参数应用相同的类型转换。下面提供两种可行的实现方式:
方法一:解析后手动处理参数
这种方式简单直接,先按字符串解析所有参数,再手动将第二个参数转为可读文件对象:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--serve', nargs=2, action='append', help='指定路径和要服务的文件') args = parser.parse_args() if args.serve: processed_serve = [] for path, file_path in args.serve: try: file_obj = open(file_path, 'r') processed_serve.append((path, file_obj)) except FileNotFoundError: parser.error(f"文件 {file_path} 不存在") args.serve = processed_serve
方法二:自定义Action类(原生argparse流程)
通过自定义Action类,在解析阶段就完成类型转换,错误提示和argparse原生逻辑统一:
import argparse class ServeAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): path = values[0] file_type = argparse.FileType('r') try: file_obj = file_type(values[1]) except argparse.ArgumentTypeError as e: parser.error(str(e)) if not hasattr(namespace, 'serve') or namespace.serve is None: setattr(namespace, 'serve', []) namespace.serve.append((path, file_obj)) parser = argparse.ArgumentParser() parser.add_argument('--serve', nargs=2, action=ServeAction, help='指定路径和要服务的文件') args = parser.parse_args()
两种方案对比
- 方法一:代码量少,适合简单场景,手动处理错误需要额外编写逻辑
- 方法二:更贴合argparse的设计规范,错误处理更统一,适合复杂的命令行工具开发
内容的提问来源于stack exchange,提问作者iggy12345
相关产品推荐
相关产品推荐

