3

これが私のargparseサンプルで、sample.pyと言う

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-p", nargs="+", help="Stuff")
args = parser.parse_args()
print args

パイソン-2.7.3

-p オプションの後に、ユーザーがスペースで区切られた引数のリストを提供することを期待しています。たとえば、実行すると

$ sample.py -p x y 
Namespace(p=['x', 'y'])

しかし、私の問題は、あなたが走るときです

$ sample.py -p x -p y
Namespace(p=['y'])

ここにもそこにもありません。以下のいずれかを希望します

  • -p を 2 回使用しないようにユーザーに例外をスローし、代わりに 1 つの引数として指定するようにします。
  • 同じオプションであると仮定して、['x','y'] のリストを生成します。

私は、python 2.7がどちらも行っていないことがわかり、混乱しています。上記の 2 つの動作のいずれかを Python に実行させることはできますか?

4

2 に答える 2

2

注: python 3.8 ではaction="extend"、必要な ['x','y'] のリストを作成する が追加されています。

['x','y'] のリストを作成するには、 を使用しますaction='append'。実際にはそれは

Namespace(p=[['x'], ['y']])

それぞれについて、によって指示される-pリストを提供しますが、その値を名前空間が既に持っているものに追加することを意味します。デフォルトのアクションは値を設定するだけです。ドキュメントの段落を確認することをお勧めします。['x']nargs='+'appendNS['p']=['x']action

optionals繰り返し使用できるように設計されています。appendや などのアクションを可能にしますcount。通常、ユーザーはそれらを繰り返し使用することを期待していないか、最後の値に満足しています。 positionals( なしで-flag) を繰り返すことはできません ( で許可されている場合を除くnargs)。

オプションまたは一度の引数を追加する方法は? 「繰り返しなし」引数を作成する方法についていくつかの提案があります。1 つは、カスタムactionクラスを作成することです。

于 2013-10-07T15:31:48.177 に答える
0

私は同じ問題に遭遇しました。mgilson の提案に従って、カスタム アクション ルートを使用することにしました。

import argparse
class ExtendAction(argparse.Action):
  def __call__(self, parser, namespace, values, option_string=None):
    if getattr(namespace, self.dest, None) is None:
      setattr(namespace, self.dest, [])
    getattr(namespace, self.dest).extend(values)
parser = argparse.ArgumentParser()
parser.add_argument("-p", nargs="+", help="Stuff", action=ExtendAction)
args = parser.parse_args()
print args

これにより、

$ ./sample.py -p x -p y -p z w
Namespace(p=['x', 'y', 'z', 'w'])

action='extend'それでも、デフォルトでライブラリにオプションがあれば、もっときれいだったでしょう。

于 2014-02-21T17:56:35.483 に答える