Optparse,旧版本只是忽略所有无法识别的参数并继续执行。在大多数情况下,这并不理想,并在argparse中进行了更改。但是在一些情况下,您希望忽略任何无法识别的参数,并解析您所指定的参数。
例如:
parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()
$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar
有办法重写这个吗?
取代
args = parser.parse_args()
与
args, unknown = parser.parse_known_args()
例如,
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']
取代
args = parser.parse_args()
与
args, unknown = parser.parse_known_args()
例如,
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']
实际上argparse仍然“忽略”_unrecognized_args。只要这些“不可识别的”参数不使用默认前缀,解析器就不会抱怨。
使用@anutbu的配置,但是使用标准的parse.parse_args(),如果我们要使用以下参数执行程序。
$ program --foo BAR a b +cd e
我们将使用这个命名空间数据集合。
Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')
如果我们想要默认的前缀-忽略,我们可以改变ArgumentParser,并决定我们将使用一个+来代替我们的“已识别”参数。
parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')
同样的命令将产生结果
Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')
把它放在你的烟斗里,抽吧=)
nJoy !