Как проанализировать отрицательный индекс для объекта среза в argparse.ArgumentParser - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы указать строку среза в качестве аргумента, см. Ниже

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

Как мне поддержать отрицательный индекс в качестве первого параметра среза?

1 Ответ

0 голосов
/ 02 мая 2018

К счастью, argparse по умолчанию понимает токен =

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

Причина, по которой -5 работает напрямую, как и следовало ожидать, связана с argparse, в которой реализована некоторая эвристика , которая подробно описана в связанной документации (в основном -5 выглядит как число, -5: нет).

Эта проблема в основном вызвана тем, что argparse рассматривает все - (по умолчанию) как флаги. Это можно переопределить, используя prefix_chars.

...