Остановить синтаксический анализ на первом неизвестном аргументе

Используя argparse, можно ли остановить синтаксический анализ аргументов при первом неизвестном аргументе?

Я нашел 2 почти решения;

  1. parse_known_args, но это позволяет обнаруживается после первого неизвестного аргумента.
  2. nargs=argparse.REMAINDER, но это не остановит синтаксический анализ до первого аргумента, не являющегося параметром. Любые параметры, предшествующие этому, которые не распознаны, вызывают ошибку.

Я что-то упустил из виду? Должен ли я вообще использовать argparse?


person Matt Joiner    schedule 14.07.2011    source источник


Ответы (2)


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

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

Если у вас есть позиционные аргументы, которые должны начинаться с '-' и не выглядят как отрицательные числа, вы можете вставить псевдоаргумент '--', который сообщает parse_args(), что все после него является позиционным аргументом:

>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)
person Mike DeSimone    schedule 14.07.2011
comment
Это на самом деле делает работу. Спасибо. - person Matt Joiner; 15.07.2011
comment
В моем случае -- не подойдет, потому что я не хочу, чтобы мои пользователи добавляли -- в свою команду в одних случаях, а в других нет: p - person pawamoy; 23.01.2021
comment
Затем скажите им, чтобы использовать его каждый раз. Например, Git настоятельно рекомендует использовать -- перед перечислением путей в git checkout. Кроме того, никто не заставляет вас всегда вставлять его; это просто для тех случаев, когда аргументы могут быть неверно истолкованы как варианты. - person Mike DeSimone; 25.01.2021
comment
В случае с git checkout параметр -- необходим для устранения неоднозначности, является ли аргумент древовидным или путевым (если не предоставлены оба). Кроме того, что, если мне нужно что-то вроде опции -c в bash или -e в xterm, где флаг указывает, что должны использоваться все оставшиеся аргументы, включая те, которые начинаются с -? - person Thayne; 17.07.2021

Один из способов сделать это, хотя он и не идеален во всех ситуациях, — использовать вместо него getopt.

Например:

import sys
import os
from getopt import getopt


flags, args = getopt(sys.argv[1:], 'hk', ['help', 'key='])

for flag, v in flags:
    if flag in ['-h', '--help']:
        print(USAGE, file=sys.stderr)
        os.exit()
    elif flag in ['-k', '--key']:
        key = v

Как только getopt встретит аргумент, не являющийся параметром, он прекратит обработку аргументов.

person Thayne    schedule 17.07.2021