dest 带有“-”的处理方式与可选和位置不同。
In [298]: import argparse
In [299]: parser = argparse.ArgumentParser()
In [300]: a1 = parser.add_argument('--a-string');
In [301]: a2 = parser.add_argument('foo-string');
In [302]: parser.print_help()
usage: ipython3 [-h] [--a-string A_STRING] foo-string
positional arguments:
foo-string
optional arguments:
-h, --help show this help message and exit
--a-string A_STRING
optional 的 dest 派生自第一个“long”标志,将任何内部“-”替换为“_”。位置的dest 是第一个参数,没有任何替换。您可以完全控制位置dest。
In [304]: args = parser.parse_args(['xxx'])
In [305]: args
Out[305]: Namespace(a_string=None, **{'foo-string': 'xxx'})
In [306]: args.a_string
dash dest 仍然可以访问:
In [307]: vars(args)['foo-string']
Out[307]: 'xxx'
In [308]: getattr(args, 'foo-string')
Out[308]: 'xxx'
“-/_”替换已完成,因此您可以在标志中使用“-”(常见的 POSIX 实践),但仍使用点语法访问属性。
在内部argparse 使用getattr 和setattr,因此它不限制dest。它不必是有效的 python 名称。这适用于可选项和位置。
如果我给可选的 dest 值(与标志不同),
In [310]: a1.dest = 'a-string' # changing the existing argument
In [312]: parser.print_help()
usage: ipython3 [-h] [--a-string A-STRING] foo-string
positional arguments:
foo-string
optional arguments:
-h, --help show this help message and exit
--a-string A-STRING
这将“A_STRING”更改为“A-STRING”,但也更改了属性名称:
In [313]: args = parser.parse_args(['xxx'])
In [314]: args
Out[314]: Namespace(**{'a-string': None, 'foo-string': 'xxx'})
metavar 让我们控制值在帮助中的显示方式。然后我们可以选择dest 来做任何实用的东西(或者如果我们愿意,也可以选择不实用的东西)。
In [315]: a1.dest='a_string'; a1.metavar='MY-STRING'
In [316]: a2.dest='foo_bar'; a2.metavar='YOUR-STRING'
In [317]: parser.print_help()
usage: ipython3 [-h] [--a-string MY-STRING] YOUR-STRING
positional arguments:
YOUR-STRING
optional arguments:
-h, --help show this help message and exit
--a-string MY-STRING
In [318]: args = parser.parse_args(['xxx'])
In [319]: args
Out[319]: Namespace(a_string=None, foo_bar='xxx')
丑陋的dest,独立于flags和metavar:
In [320]: a1.dest='a-#$'; a2.dest='-xxx$3'
In [321]: args = parser.parse_args(['xxx'])
In [322]: args
Out[322]: Namespace(**{'-xxx$3': 'xxx', 'a-#$': None})
In [323]: getattr(args, '-xxx$3')
Out[323]: 'xxx'
In [324]: parser.print_usage()
usage: ipython3 [-h] [--a-string MY-STRING] YOUR-STRING
有些人认为位置应该执行 '-/_' 替换。但是由于metavar 可以完全控制帮助显示,因此没有必要这样做。充其量只是让positionals 表现得更像'可选'。
metavar 的选项更加有限。特殊字符可能会弄乱usage 格式,尤其是在使用很长(多行)或具有互斥组的情况下。这种格式相当脆弱。