34

我有一个使用默认名称和密码的程序。我正在使用 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

4

3 回答 3

25

我相信处理这个问题的最好方法是对返回的命名空间进行后处理。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"

似乎就足够了。

于 2013-01-16T02:21:27.543 回答
22

我知道这已经晚了两年多,但我找到了一种简洁明了的方法:

if bool(ns.username) ^ bool(ns.password):
    parser.error('--username and --password must be given together')

^是 Python 中的 XOR 运算符。要求在命令行中给出两个参数本质上是一个 XOR 测试。

于 2015-10-07T17:11:41.587 回答
8

这大概就是我的做法。由于您拥有可以更改选项的现有默认值,因此请定义默认值,但不要将它们用作参数默认值:

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
于 2013-01-16T02:26:13.473 回答