【发布时间】:2020-05-12 21:20:19
【问题描述】:
我正在尝试编写一个支持任意位操作的程序:位图的 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 也有帮助 - 但我两者都想要。我需要手动实现它还是有什么技巧或其他库可以让我到达那里?
编辑我想通过显示我需要手动编写的代码来阐明我在寻找什么:
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)
有没有更优雅的方式到达那里?
【问题讨论】:
-
@DJSchaffner 不,没有帮助。不过这也没有什么意义 - 请记住,kwargs 可以按任何顺序出现,只要它们在 args 之后。
-
与
store_const,nargs设置为0,因此您无法添加自己的值。但是当参数的标志是'--or'时,为什么要存储“或”字符串。你不想args.or=="or"是吗? -
@hpaulj 我希望能够做到
program.py --or f1.bit f2.bit并将mode="or"和文件名存储在其他地方 -
Argparse 会将其存储为(以字典形式)
{'or': ['f1.bit','f2.bit']}。 'or' 是key,一个名称列表的值。 -
您也可以使用
subcommands方法,如文档中所述。
标签: python command-line argparse