argparse:使用必需参数的值设置可选参数

时间:2012-08-17 14:27:33

标签: python default-value argparse

使用Python的argparse,我想添加一个可选参数,如果没有给出,则获取另一个(强制)参数的值。

parser.add_argument('filename',
                    metavar = 'FILE',
                    type    = str,
                    help    = 'input file'
                    )

parser.add_argument('--extra-file', '-f',
                    metavar = 'ANOTHER_FILE',
                    type    = str,
                    default = ,
                    help    = 'complementary file (default: FILE)'
                    )

我可以在解析参数后手动检查None,但是不是有更多的pythonic方法吗?

2 个答案:

答案 0 :(得分:15)

据我所知,除此之外没有办法做得更干净:

ns = parser.parse_args()
ns.extra_file = ns.extra_file if ns.extra_file else ns.filename

(就像你在问题中提出的那样)。

可能可能会做一些custom action gymnastics similar to this,但我真的认为这不值得(或“pythonic”)。

答案 1 :(得分:2)

这与原始选项集的语义略有不同,但可能适合您:

parse.add_argument('filename', action='append', dest='filenames')
parse.add_argument('--extra-file', '-f', action='append', dest='filenames')
args = parse.parse_args()

这会将args.filename替换为至少一个文件的列表args.filenames-f将其参数附加到该列表。由于可以在位置参数之前在命令行上指定-f,因此您无法在args.filenames中输入文件的任何特定顺序。


另一个选择是免除-f选项并使filename成为多值位置参数:

parse.add_argument('filenames', nargs='+')

同样,args.filenames将是至少一个文件名的列表。如果您的脚本有其他位置参数,这也会产生干扰。