Python 在argparse中,是否使用互斥参数?

Python 在argparse中,是否使用互斥参数?,python,argparse,command-line-interface,Python,Argparse,Command Line Interface,命令行中某些数据(如电子邮件地址)的必读列表: some_util -l email1@x.com email2@x.com 或从文件: some_util -L email.lst 如何使它不能在argparse中使用两个键-l和-l的组合 import argparse import sys def createCLParser(): parser = argparse.ArgumentParser() parser.add_argument('-l', '--list'

命令行中某些数据(如电子邮件地址)的必读列表:

some_util -l email1@x.com email2@x.com
或从文件:

some_util -L email.lst
如何使它不能在argparse中使用两个键-l和-l的组合

import argparse
import sys
def createCLParser():
    parser = argparse.ArgumentParser()
    parser.add_argument('-l', '--list', nargs='+', help='list from comand line')
    parser.add_argument('-L', '--list-file', type=argparse.FileType(), help='list from file')
    return parser
if __name__ == '__main__':
    parser = createCLParser()
    namespace = parser.parse_args(sys.argv[1:])

argparse中有一个方法add_mutual_exclusive_group(),但它必须是可选的。

因为其中一个是必需的,所以此用例更适合于子命令:

some_util fromList email1@x.com email2@x.com

代码类似于

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
addr_parser = subparsers.add_parser("fromList")
file_parser = subparsers.add_parser("fromFile")

addr_parser.add_argument("addresses", nargs="+")
addr_parser.setdefaults(command="fromList")
file_parser.add_argument("address_file")
file_parser.setdefaults(command="fromFile")

parser.set_defaults(
args = parser.parse_args()

if args.command == "fromList":
    # use args.addresses
elif args.command == "fromFile":
    # read addresses from file named by args.address_file
使用
required=True的方法:

import argparse
import sys
def createCLParser():
    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-l', '--list', nargs='+', help='list from comand line')
    group.add_argument('-L', '--list-file', type=argparse.FileType(), help='list from file')

    return parser
if __name__ == '__main__':
    parser = createCLParser()
    namespace = parser.parse_args(sys.argv[1:])
    print namespace
用法:

$ python ar.py 
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: one of the arguments -l/--list -L/--list-file is required

$ python ar.py -l foo@example.com
Namespace(list=['foo@example.com'], list_file=None)

$ python ar.py -l foo@example.com -L bar
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: argument -L/--list-file: not allowed with argument -l/--list

为什么这些是相互排斥的?如果我有一个文件,我想在命令行上添加一些电子邮件地址怎么办?为什么不在事后手动检查这两个标志是否存在?总的来说,我觉得这是一个更好的解决方案,因为它使代码更容易重新配置。这正是
add\u mutual\u exclusive\u group()
的设计目的。那它对你不起作用呢?
$ python ar.py 
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: one of the arguments -l/--list -L/--list-file is required

$ python ar.py -l foo@example.com
Namespace(list=['foo@example.com'], list_file=None)

$ python ar.py -l foo@example.com -L bar
usage: ar.py [-h] (-l LIST [LIST ...] | -L LIST_FILE)
ar.py: error: argument -L/--list-file: not allowed with argument -l/--list