Argparse含位置参数时,如何通过可选参数传递多个值?
解决argparse可选参数与位置参数冲突的问题
不需要自定义解析器,argparse本身提供了多种内置方案来解决这个问题:
方案1:用--分隔可选参数和位置参数
argparse支持用--作为分隔符,明确告知解析器:--之后的所有内容都属于位置参数,不会被当作可选参数的取值。执行命令时这样写:
python3 myFunc.py -p 80 8080 -- 10.0.0.1
此时80和8080会被正确识别为ports的参数,10.0.0.1则是位置参数host。
方案2:调整参数定义顺序,将位置参数放在前面
把位置参数host的定义放在可选参数之前:
parser.add_argument('host') parser.add_argument('-p', '--ports', nargs='+', type=int)
之后按如下方式执行命令即可:
python3 myFunc.py 10.0.0.1 -p 80 8080
这种方式符合大多数命令行工具的使用习惯,用户更容易理解和操作。
方案3:自定义类型解析逗号分隔的端口值
如果需要保留-p=的传参形式,可以自定义类型来处理逗号分隔的多个值:
def parse_ports(s): return list(map(int, s.split(','))) parser.add_argument('-p', '--ports', type=parse_ports)
执行命令时用逗号分隔端口:
python3 myFunc.py -p=80,8080 10.0.0.1
这种方式能让argparse正确解析-p=后的多个端口值。
内容的提问来源于stack exchange,提问作者Sebastian Dine
相关产品推荐
相关产品推荐

