argparse位置参数顺序混乱报错,能否像getopt一样加前缀标识?
结论
argparse 的位置参数原生不支持带前缀标识的功能,位置参数的核心设计逻辑就是按照输入的先后顺序匹配赋值,无法通过前缀跳过顺序匹配。
如果你需要实现带-i/-o这类前缀标识、同时参数必须填写不允许省略的效果,只需要把参数声明为必填的可选参数即可,完全可以满足你的需求。
修改后的代码示例
import argparse import pathlib def main(argv): parser = argparse.ArgumentParser() # 声明为带短前缀、长名称的可选参数,添加required=True设为必填 parser.add_argument('-p', '--projectType', type=str, help='c or c++ project type', choices=['c', 'c++'], required=True) parser.add_argument('-i', '--inputfile', type=pathlib.Path, help='the input file path', required=True) parser.add_argument('-o', '--outputfile', type=pathlib.Path, help='the output file path', required=True) args = parser.parse_args(argv) # 后续使用和位置参数完全一致,直接通过args.projectType、args.inputfile调用即可
补充说明
- 你原来的代码存在语法错误:
add_argument第一个参数如果是不带-/--的字符串,会被识别为位置参数的名称,不能同时传两个名称(你写的('p', 'projectType')写法只有可选参数支持) - 设置
required=True的可选参数,运行时如果不传会直接抛出缺失参数的报错,和位置参数的必填校验逻辑完全一致,同时支持任意顺序输入,比如你可以先输-i xxx -o xxx -p c,也可以先输-p c++ -o xxx -i xxx,都能正常解析。
内容的提问来源于stack exchange,提问作者moonfungus
相关产品推荐
相关产品推荐

