这看起来像是个窃听器.你应该go 报案.
argparse.py
中的This code是_get_values
的开始,_get_values
是用于解析值的主要助手函数之一:
if action.nargs not in [PARSER, REMAINDER]:
try:
arg_strings.remove('--')
except ValueError:
pass
该代码接收--
参数作为列表['--']
的单个元素.它试图从列表中删除'--'
,因为当使用--
作为选项结束标记时,对于_get_values
个调用中的一个,'--'
字符串将以arg_strings
结尾.但是,当'--'
是实际的参数值时,代码仍然会删除它,因此arg_strings
最终是一个空列表,而不是单元素列表.
然后,代码通过一个Else-If链来处理不同类型的参数(这里省略了分支主体以节省空间):
# optional argument produces a default when not present
if not arg_strings and action.nargs == OPTIONAL:
...
# when nargs='*' on a positional, if there were no command-line
# args, use the default if it is anything other than None
elif (not arg_strings and action.nargs == ZERO_OR_MORE and
not action.option_strings):
...
# single argument or optional argument produces a single value
elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
...
# REMAINDER arguments convert all values, checking none
elif action.nargs == REMAINDER:
...
# PARSER arguments convert all values, but check only the first
elif action.nargs == PARSER:
...
# SUPPRESS argument does not put anything in the namespace
elif action.nargs == SUPPRESS:
...
# all other types of nargs produce a list
else:
...
这个代码应该经过第三个分支,
# single argument or optional argument produces a single value
elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
但是因为arg_strings
中缺少参数,所以len(arg_strings)
是0.相反,它触及了最后一个 case ,该 case 本应处理一种完全不同的论点.该分支最终返回一个空列表,而不是本应返回的'--'
个字符串,这就是args.delimiter
最终是一个空列表而不是'--'
字符串的原因.
这个错误也表现为位置参数.例如,
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('a')
parser.add_argument('b')
args = parser.parse_args(["--", "--", "--"])
print(args)
fingerprint
Namespace(a='--', b=[])
因为当_get_values
处理b
参数时,它将['--']
作为arg_strings
接收,并删除'--'
.在处理a
参数时,它收到['--', '--']
,表示一个选项结束标记和一个实际的--
参数值,并且它成功地删除了选项结束标记,但在处理b
时,它删除了实际的参数值.