Argparse和互斥的命令行参数

时间:2019-01-15 10:16:38

标签: python python-3.x argparse

我已经在python中创建了pastebin终端客户端。它可能需要一些命令行参数,例如-o打开文件,-n设置粘贴名称等。它还具有选项-l,其中列出了粘贴内容,并允许您删除或查看粘贴。问题是我不知道如何以一种不错的方式(使用argparse)来做-它不应允许将-l与其他选项一起使用。

我添加了一个简单的逻辑:

if args.name:
    if args.list:
        print('The -l should be used alone. Check "pb -h" for help.')
    sys.exit()

可以仅使用argparse来完成吗? 我知道互斥的组,我什至有一个(用于设置粘贴隐私),但我还没有想到。

此处提供完整代码:https://github.com/lkorba/pbstc/blob/master/pb

1 个答案:

答案 0 :(得分:1)

我认为您无法使用argparse来实现您所说的“一种不错的方式”。

我在这里看到2个选项:

1)我得到的最简单的解决方案是在解析它们之后只检查您的参数。没什么好看的:

args = parser.parse_args()
if args.list is not None:
    if not (args.name is None and args.open is None and
            args.public is None and args.format is None and args.exp is None):
        parser.error('Cannot use list with name, open, public, format or exp argument')

2)另一方面,您可以修改程序并使用     subparsers喜欢:

subparsers = parser.add_subparsers(title="commands", dest="command")

parser_a = subparsers.add_parser('list', help='list help')

parser_b = subparsers.add_parser('action', help='Any action here')
parser_b.add_argument('-f', action="store", help='Choose paste format/syntax: text=None, '
                                                            'mysql=MYSQL, perl=Perl, python=Python etc...')
parser_b.add_argument('-n', '--name', action="store")
parser_b.add_argument('-o', '--open', action="store", help='Open file')
...

args = parser.parse_args()
if args.command == 'list':
    ...
elif args.command == 'action':
    ...

因此,例如,如果在后一种情况下将list -n='Name'作为参数传递,则会出现错误:

  

用法:subparser_example.py [-h] {list,action} ...
  subparser_example.py:错误:无法识别的参数:-n =“名称”

当然,您在这里还(作为开销)获得了一个额外的参数action ...