我有一个使用默认名称和密码的程序。我正在使用argparse来允许用户指定命令行选项,我想让用户为程序提供不同的名称和密码以供使用。所以我有以下内容:
parser.add_argument(
'-n',
'--name',
help='the login name that you wish the program to use'
)
parser.add_argument(
'-p',
'--password',
help='the password to log in with.'
)
但是仅指定名称或仅指定密码没有任何意义,但指定两者都没有意义。我注意到argparse确实能够指定两个参数是互斥的。但我所拥有的是必须同时出现的两个论点。我该如何得到这种行为? (我发现文档中提到了“论证组”,但它们似乎没有解决我的问题http://docs.python.org/2/library/argparse.html#argument-groups)
答案 0 :(得分:21)
我认为处理此问题的最佳方法是对返回的命名空间进行后处理。 argparse
不支持此原因的原因是它一次解析参数1。 argparse
很容易检查是否已经解析了某些内容(这就是互斥参数的工作原理),但要查看是否 在<将来
简单:
parser.add_argument('-n','--name',...,default=None)
parser.add_argument('-p','--password',...,default=None)
ns = parser.parse_args()
if len([x for x in (ns.name,ns.password) if x is not None]) == 1:
parser.error('--name and --password must be given together')
name = ns.name if ns.name is not None else "default_name"
password = ns.password if ns.password is not None else "default_password"
似乎就足够了。
答案 1 :(得分:16)
我知道这已经晚了两年多了,但我找到了一个简洁明了的方法:
if bool(ns.username) ^ bool(ns.password):
parser.error('--username and --password must be given together')
^
是Python中的XOR运算符。要求在命令行给出的两个参数本质上是一个XOR测试。
答案 2 :(得分:7)
这可能就是我的表现。由于您现有默认值并且有更改选项,因此请定义默认值,但不要将它们用作参数默认值:
default_name = "x"
default_pass = "y"
parser.add_argument(
'-n',
'--name',
default=None,
help='the login name that you wish the program to use'
)
parser.add_argument(
'-p',
'--password',
default=None,
help='the password to log in with.'
)
args = parser.parse_args()
if all(i is not None for i in [args.name, args.password]):
name = args.name
passwd = args.password
elif any(i is not None for i in [args.name, args.password]):
parser.error("Both Name and Password are Required!")
else:
name = default_name
passwd = default_pass