21

使用 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的方法吗?

4

2 回答 2

18

据我所知,没有比这更干净的方法了:

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

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

可能可以做一些与此类似的自定义动作体操,但我真的认为这不值得(或“pythonic”)。

于 2012-08-17T14:34:04.717 回答
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-fargs.filenames


另一种选择是放弃该-f选项并进行filename多值位置参数:

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

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

于 2012-08-17T14:53:29.250 回答