15

argparseは、明確な場合にデフォルトの省略形を使用します。

略語は必要ないので、無効にします。しかし、ドキュメントでそれを見つけられませんでした。

出来ますか?

例:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--send', action='store_true')
parser.parse_args(['--se']) # returns Namespace(send=True)

ただし、完全なパラメーターが指定されている場合にのみtrueにする必要があります。ユーザーエラーを防ぐため。

アップデート:

Vikasが回答した後、pythonバグトラッカーでチケットを作成しました。そして、それはすでに処理されています。

4

4 に答える 4

10

Python 3.5.0以降、次のコマンドでArgumentParserを開始することにより、省略形を無効にできます。

parser = argparse.ArgumentParser(allow_abbrev=False)

ドキュメントも参照してください。

于 2015-06-02T04:50:29.633 に答える
4

いいえ、醜いハックなしではありません。

@Vladimirが投稿したコードスニペットは、あなたが探しているものではないと思います。これを実行している実際のコードは次のとおりです。

def _get_option_tuples(self, option_string):
    ...
    if option_string.startswith(option_prefix):
    ...

チェックがstartswithないことを参照してください==

そして、いつでも拡張して、この動作を変更argparse.ArgumentParserするための独自の機能を提供できます。toと:_get_option_tuples(self, option_string)の2つのオカレンスを置き換えるだけです。option_string.startswith(option_prefix)option_string == option_prefix

>>> parser = my_argparse.MyArgparse
>>> parser = my_argparse.MyArgparse()
>>> parser.add_argument('--send', action='store_true')
_StoreTrueAction(option_strings=['--send'], dest='send', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args(['--se'])
usage: [-h] [--send]
: error: unrecognized arguments: --se

注意の言葉

メソッドの前には、_get_option_tuplesが付いて_います。これは通常、Pythonのプライベートメソッドを意味します。また、プライベートをオーバーライドすることはお勧めできません。

于 2012-05-25T08:53:39.670 に答える
4

いいえ、どうやらこれは不可能です。少なくともPython2.7.2では。

最初に、私はドキュメントを調べました-無駄に。

次に、Lib \ argparse.pyを開き、ソースコードを調べました。多くの詳細を省略して、各引数は次のような正規表現によって解析されるようです(argparse:2152):

    # allow one or more arguments
    elif nargs == ONE_OR_MORE:
        nargs_pattern = '(-*A[A-]*)'

この正規表現は「-」と「-」の両方を正常に解析するため、短い引数と長い引数を制御することはできません。他の正規表現も-*構文を使用するため、パラメーターのタイプに依存しません(サブ引数なし、1つのサブ引数など)。

コードの後半で、ダブルダッシュは1つのダッシュに変換され(オプションではない引数の場合のみ)、ユーザーが制御するフラグはありません。

    # if this is an optional action, -- is not allowed
    if action.option_strings:
        nargs_pattern = nargs_pattern.replace('-*', '')
        nargs_pattern = nargs_pattern.replace('-', '')
于 2012-05-25T08:31:59.023 に答える
4

Python2.7の別の方法。不格好になりましょう!--dog省略形なしで認識したいとします。

p = argparse.ArgumentParser()
p.add_argument('--dog')
p.add_argument('--dox', help=argparse.SUPPRESS, metavar='IGNORE')

--dox3番目の文字だけで必要な引数とは異なる2番目の引数を追加すると、あいまい--dになります。--doしたがって、パーサーはそれらの認識を拒否します。結果の例外をキャッチし、呼び出しているコンテキストに従って処理するコードを追加する必要がありますparse_args。ヘルプテキストを抑制/微調整する必要がある場合もあります。

help=...は、引数をデフォルトのヘルプメッセージのオプションリストから除外し(これにより)、metavar='IGNORE'このオプションで実際に何もしていないことを明確にするためのものです:)。

于 2016-09-13T21:52:24.740 に答える