Python NARG取决于其他设置?

Python NARG取决于其他设置?,python,command-line,argparse,Python,Command Line,Argparse,我正在尝试编写一个支持任意位操作的程序:和、或、不和位图计数。用法是运行program.py-和f1.bit f2.bit,然后将结果打印到标准输出 问题是我希望解析器处理所有的警告。具体来说,我希望NARG取决于设置的模式-如果设置为计数或不计数,则只需要一个文件,如果设置为或,则只需要两个文件。下面是一些不起作用的示例代码: #!/usr/bin/env python import argparse def main(mode, fnames): pass if __name_

我正在尝试编写一个支持任意位操作的程序:和、或、不和位图计数。用法是运行program.py-和f1.bit f2.bit,然后将结果打印到标准输出

问题是我希望解析器处理所有的警告。具体来说,我希望NARG取决于设置的模式-如果设置为计数或不计数,则只需要一个文件,如果设置为或,则只需要两个文件。下面是一些不起作用的示例代码:

#!/usr/bin/env python

import argparse

def main(mode, fnames):
    pass

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-O', '--or',
        nargs=2,
        action='store_const', const='or'
    )
    args = parser.parse_args()

    import pprint
    pprint.pprint(args.__dict__)

    #main(**args.__dict__)
我得到的错误是:

Traceback (most recent call last):
  File "bitmaptool.py", line 12, in <module>
    action='store_const', const='or'
  File "/usr/lib/python3.7/argparse.py", line 1362, in add_argument
    action = action_class(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'nargs'
有没有更优雅的方法来达到这个目的呢?

存储常量从不获取参数,它会直接存储您所说的常量或无。因为它是常数,不是变量。从ephasis矿山:

'store_const'-存储由const关键字参数指定的值。“store_const”操作最常用于指定某种标志的可选参数

您应该将操作更改为实际存储传递的文件名的操作。根据和示例,实际上根本不需要指定操作,默认的action='store'就足够了

文档中的示例:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2) #this line
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
编辑问题的编辑版本-将确保仅指定该组中的一个参数,当然:

if __name__ == '__main__':
    parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
    parser.add_argument('-o', '--output', default='/dev/stdout')

    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-O', '--or', nargs=2)
    group.add_argument('-A', '--and', nargs=2)
    group.add_argument('-M', '--minus', nargs=2)
    group.add_argument('-C', '--count', nargs=1)
    group.add_argument('-N', '--not', nargs=1)

    args = parser.parse_args().__dict__

    import pprint
    pprint.pprint(args)

@Djshaffner不,没有帮助。不过这也没有什么意义——请记住,kwargs可以以任何顺序出现,只要它们在args之后。使用store_const,nargs设置为0,因此您不能添加自己的值。但是,当参数的标志为“-or”时,为什么要存储or字符串呢。你不需要args.or==或者你需要吗?@hpaulj我希望能够执行program.py-或者f1.bit f2.bit,并将mode=or和文件名以其他方式存储,而rgparse将以字典形式{'or':['f1.bit','f2.bit']}存储它们“或”是键,是名称列表和值。您也可以使用子命令方法,如文档中所述。我修改了我的问题,以澄清我要查找的内容。我希望它现在能解释为什么不幸的是,你的解决方案似乎不够。抱歉造成混乱!您指定了一个或多个模式=互斥组-;如果required=True,则确保从该groupNice中只得到一个参数,只剩下以下部分:mode=None;对于['或','和','非','计数']中的当前_模式:如果参数中的当前_模式:模式=当前_模式。我想这在argparse中是不可能的,因为现在这样做了,你就可以得到一本字典,对吗?键是参数,值是。。。嗯,价值观。我们修正了这个问题,所以我们总是得到两个参数的输出,以及期望的运算和它的值。所以模式是字典里唯一的键;mode=[key for key in args if key!='output'][0]是一个单行程序,看起来很奇怪,但实际上它会过滤掉不是“output”的键,因此只剩下我们想要的键。所以:output=args['output']和input_files=args[mode]。现在您有了模式、输出和输入_文件,您不必再在args中搜索它们了;
if __name__ == '__main__':
    parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
    parser.add_argument('-o', '--output', default='/dev/stdout')

    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-O', '--or', nargs=2)
    group.add_argument('-A', '--and', nargs=2)
    group.add_argument('-M', '--minus', nargs=2)
    group.add_argument('-C', '--count', nargs=1)
    group.add_argument('-N', '--not', nargs=1)

    args = parser.parse_args().__dict__

    import pprint
    pprint.pprint(args)