如何将切片对象的负索引解析为 argparse.ArgumentParser

How to parse negative index for slice object to argparse.ArgumentParser

我想给切片字符串作为参数,见下文

import argparse

def _parse_slice(s):
    a = [int(e) if e.strip() else None for e in s.split(":")]
    return slice(*a)


if __name__ == '__main__':
    p = argparse.ArgumentParser()
    p.add_argument('-s', type=_parse_slice)
    args = p.parse_args()

    print(args.s)

它在正索引下工作正常,例如 -s 1:10-s -5(产生 slice[None, -5, None])也很好,但在负索引作为第一个参数时出错,例如,-5:

usage: slice-parse.py [-h] [-s S]
slice-parse.py: error: argument -s: expected one argument

我应该如何支持负索引作为第一个切片参数?

幸运的是,argparse 默认情况下理解 = 令牌

$ python slice-parse.py -s=-5:
slice(-5, None, None)

-5 可以像预期的那样直接工作的原因是 argparseimplemented some heuristics,链接文档中有详细说明(基本上 -5 看起来像一个数字,-5: 没有)。

这个问题主要是由 argparse 将所有 -(默认情况下)视为标志引起的。这可以使用 prefix_chars.

重新定义