我正在尝试编写一个支持任意按位运算的程序:位图的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)
到达那里是否有更优雅的方式?
store_const
从不获取参数,它实际上存储了您所说的const
或None
。因为它是一个常量,而不是变量。在argparse's action
documentation中,向我发声:
action
-此存储由const关键字参数指定的值。'store_const'
操作最常与指定某种标志。]的可选参数一起使用。您应该将操作更改为实际上将存储传递的文件名的操作。根据
'store_const'
和示例,实际上您根本不需要指定argparse'snargs
documentation,默认值(nargs
)就足够了。
文档中的示例:
action