argparse:如何获取名称无法正常访问的位置参数?

argparse: How to get positional argument with name that can't be accessed normally?

如何在不重命名的情况下获取参数 "IP/DOMAIN"?我不想重命名它,因为我希望 -h 专门显示 "IP/DOMAIN" 而不是像 "IP_DOMAIN".

这样的东西
parser = argparse.ArgumentParser()
parser.add_argument('PORT', help='')
parser.add_argument('IP/DOMAIN', help='')
args = parser.parse_args()

我能做到:

args.PORT

但是我做不到:

args.IP/DOMAIN

什么也不起作用:

args["IP/DOMAIN"]
args[0]

一个简单的设置:

In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: a1 = parser.add_argument('IP/DOMAIN')
In [4]: a2 = parser.add_argument('easy', metavar='IP/DOMAIN')

通过 metavar 我们可以提供一个易于使用的 dest:

In [5]: parser.print_help()
usage: ipython3 [-h] IP/DOMAIN IP/DOMAIN

positional arguments:
  IP/DOMAIN
  IP/DOMAIN

optional arguments:
  -h, --help  show this help message and exit

查看解析结果:

In [6]: arg = parser.parse_args('foo bar'.split())
In [7]: arg
Out[7]: Namespace(easy='bar', **{'IP/DOMAIN': 'foo'})

如果名字简单,一个有效的Python变量,我们可以使用属性访问:

In [8]: arg.easy
Out[8]: 'bar'

但对于一般用途,getattr 有效。 argparse 实际上使用这个(和 setattr)来最小化它对你的假设 dest:

In [9]: getattr(arg, 'IP/DOMAIN')
Out[9]: 'foo'

我们还可以将命名空间转换为 dict:

In [10]: vars(arg)
Out[10]: {'IP/DOMAIN': 'foo', 'easy': 'bar'}
In [11]: vars(arg)['IP/DOMAIN']
Out[11]: 'foo'