im是新的python argparse,我想让它成为这样,所以用法如下:
mono.py [-h] (--encrypt KEY | --decrypt KEY) [--out FILE] FILE
但我所能做的就是
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--encrypt",dest='key',action="store_true", help="enrycpt given a key")
group.add_argument("--decrypt",dest='key',action="store_true", help="decrypt given a key")
parser.add_argument("--out",help="if --out is specified output to the file", action="store_true")
parser.add_argument("FILE", help="FILE to decrypt/encrypt")
args = parser.parse_args()
它给出了这样的用法:
mono.py [-h] (--encrypt| --decrypt) [--out] FILE
有人能解释一下如何将变量KEY/FILE链接到参数吗?
首先,不要将action="store_true"
用于要接受参数的选项。如果提供了选项,它们将只存储True
,如果没有,则存储False
。有关操作,请参阅文档。
接下来,使用metavar而不是dest,正如jonrsharpe在评论中指出的那样:
请注意,您无法从生成的命名空间中判断用户是要求您加密还是解密,这可能是一个问题。
最后,对--out
也使用一个metavar。
下面是一个示例,为了简单起见,去掉了FILE
参数和帮助文本:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--encrypt", metavar='KEY')
group.add_argument("--decrypt", metavar='KEY')
parser.add_argument("--out", metavar="FILE")
parser.print_usage()
输出:
usage: tmp.py [-h] (--encrypt KEY | --decrypt KEY) [--out FILE]
解析示例:
for s in '--encrypt k', '--decrypt k', '--encrypt k --out f':
print(parser.parse_args(s.split()))
Namespace(decrypt=None, encrypt='k', out=None)
Namespace(decrypt='k', encrypt=None, out=None)
Namespace(decrypt=None, encrypt='k', out='f')
加密和解密(伪代码(的示例用法:
file = args.file
if args.encrypt is not None:
key = args.encrypt
encrypt(file, key)
elif args.decrypt is not None:
key = args.decrypt
decrypt(file, key)
else:
error('This should never happen')
这可能写得更有说服力一些。例如,可以将KEY
设置为必需的位置参数,而不是--encrypt
/--decrypt
的参数。