取决于其他设置?

问题描述 投票:0回答:1

我正在尝试编写一个支持任意按位运算的程序:位图的AND,OR,NOT和COUNT。用法是您运行program.py --and f1.bit f2.bit,它将结果打印到标准输出。

问题是我希望解析器处理所有警告。具体来说,我希望nargs取决于所设置的模式-如果将其设置为COUNT或NOT,则只需要一个文件,如果将其设置为OR或AND,则只需要两个即可。这是一些(无效的)示例代码:

#!/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'

注释nargs有帮助,忽略nargs但注释action也一样-但我都想要。我需要手动实现它,还是有技巧或其他可以让我到达那里的库?

EDIT我想通过显示需要手动编写的代码来阐明要寻找的东西,以使其正常工作:

if __name__ == '__main__':
    parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
    parser.add_argument('-O', '--or', nargs=2)
    parser.add_argument('-A', '--and', nargs=2)
    parser.add_argument('-M', '--minus', nargs=2)
    parser.add_argument('-C', '--count', nargs=1)
    parser.add_argument('-N', '--not', nargs=1)
    parser.add_argument('-o', '--output', default='/dev/stdout')
    args = parser.parse_args().__dict__

    mode = None
    files = []
    for current_mode in ['or', 'and', 'not', 'count']:
        if current_mode in args:
            if mode is not None:
                sys.exit('ERROR: more than one mode was specified')
            mode = current_mode
            files = args[mode]

    if mode is None:
        sys.stderr.write('ERROR: no mode was specified\n\n')
        parser.print_help()
        sys.exit(1)

    import pprint
    pprint.pprint(args)

到达那里是否有更优雅的方式?

python command-line argparse
1个回答
0
投票

store_const 从不获取参数,它实际上存储了您所说的constNone。因为它是一个常量,而不是变量。在argparse's action documentation中,向我发声:

action-此存储由const关键字参数指定的值'store_const'操作最常与指定某种标志。]的可选参数一起使用。

您应该将操作更改为实际上将存储传递的文件名的操作。根据'store_const'和示例,实际上您根本不需要指定argparse's nargs documentation,默认值(nargs)就足够了。

文档中的示例:

action
© www.soinside.com 2019 - 2024. All rights reserved.