正如我在评论中所写,子解析器是一个位置参数。
用简单的位置来说明:
In [307]: parser = argparse.ArgumentParser()
In [308]: a1 = parser.add_argument('foo')
In [309]: parser.parse_known_args(['one','two'])
Out[309]: (Namespace(foo='one'), ['two'])
“one”分配给第一个位置。现在给foo
选择:
In [310]: a1.choices = ['bar','test']
In [311]: parser.parse_known_args(['one','two'])
usage: ipython3 [-h] {bar,test}
ipython3: error: argument foo: invalid choice: 'one' (choose from 'bar', 'test')
它仍在尝试将第一个字符串分配给foo
。因为不匹配choices
,它会引发错误。
In [312]: parser.parse_known_args(['bar','one','two'])
Out[312]: (Namespace(foo='bar'), ['one', 'two'])
字符串根据位置而不是值分配给位置。任何值检查(例如类型或选择)都是在分配后完成的。
改变choices
to a type
test:
In [313]: a1.choices = None
In [314]: a1.type = int
In [315]: parser.parse_known_args(['bar','one','two'])
usage: ipython3 [-h] foo
ipython3: error: argument foo: invalid int value: 'bar'
In [316]: parser.parse_known_args(['12','one','two'])
Out[316]: (Namespace(foo=12), ['one', 'two'])