python argparse - 两者都是可选参数,或者两者都不是

jon*_*omo 26 python command-line-arguments argparse

我有一个使用默认名称和密码的程序.我正在使用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.'
    )
Run Code Online (Sandbox Code Playgroud)

但是仅指定名称或仅指定密码没有任何意义,但指定两者都没有意义.我注意到argparse确实能够指定两个参数是互斥的.但我所拥有的是必须同时出现的两个论点.我该如何得到这种行为?(我发现文档中提到了"论证组",但它们似乎没有解决我的问题http://docs.python.org/2/library/argparse.html#argument-groups)

mgi*_*son 22

我认为处理此问题的最佳方法是对返回的命名空间进行后处理.,之所以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"
Run Code Online (Sandbox Code Playgroud)

似乎就足够了.


小智 19

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

if bool(ns.username) ^ bool(ns.password):
    parser.error('--username and --password must be given together')
Run Code Online (Sandbox Code Playgroud)

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

  • 如果仅提供用户名或密码,@KaustubhKarkare `XOR` 评估为 `True`。上面描述了这种情况下的失败情况,所以它应该是“XOR”。 (4认同)

mon*_*kut 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,并更新了检查无,而不是虚假. (2认同)