Python argparse疑难:以短横线开头的参数为何无法正常解析?
关于argparse解析以短横线开头的位置参数问题
先看示例代码:
# parseargs.py import argparse parser = argparse.ArgumentParser() parser.add_argument("s") args = parser.parse_args()
问题现象
- 直接运行
python parseargs.py -string,argparse会报错unrecognized arguments: -string,把它判定为未知选项; - 用引号包裹参数
python parseargs.py '-string'(单双引号均无效),依然触发相同错误; - 给参数加末尾空格,运行
python parseargs.py '-string ',就能正常解析并接收参数。
原因解析
- 引号的作用局限:引号是shell层面的语法,仅用于处理含空格或特殊字符的参数,但shell会在把参数传给Python程序前去掉引号,传到argparse里的还是纯
-string,参数本身内容没变化。 - argparse的选项识别逻辑:argparse会优先把以
-开头的非空字符串识别为命令行选项,不管它是不是你要的位置参数。只要字符串首字符是-且后面跟着有效字符,就会被当作选项匹配,匹配不到就报错。 - 末尾空格的作用:当参数是
-string(带末尾空格)时,虽然开头是-,但argparse的选项判定逻辑会认为这不是合法选项——合法选项要求-后面紧跟非空白的有效字符,而这个参数的-后内容末尾是空白,不符合选项格式,于是argparse就把它当作普通位置参数处理,自然能正常接收。
如果要验证,可以在代码里加一行print(repr(args.s)),运行带空格的命令后会输出'-string ',能看到实际接收到的参数确实包含末尾空格。
内容的提问来源于stack exchange,提问作者David Shaw
相关产品推荐
相关产品推荐

