2

次のような python 関数があるとします。

def foo(spam, eggs, ham):
    pass

位置引数のみを使用して呼び出すことfoo(1, 2, 3)もできますが ( )、明示的に と言うfoo(spam=1, eggs=2, ham=3)か、2 つを組み合わせることもできます ( foo(1, 2, ham=3))。

argparse で同じ種類の機能を取得することは可能ですか? キーワード付きの位置引数がいくつかありますが、1 つだけを使用するときにそれらすべてを定義したくありません。

4

3 に答える 3

4

次のようなことができます。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--foo',dest='foo',default=None)

parser.add_argument('bar',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--bar',dest='bar',default=None)

parser.add_argument('baz',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--baz',dest='baz',default=None)

print parser.parse_args()

あなたが説明するようにほとんど動作します:

temp $ python test.py 1 2 --baz=3
Namespace(bar='2', baz='3', foo='1')
temp $ python test.py --baz=3
Namespace(bar=None, baz='3', foo=None)
temp $ python test.py --foo=2 --baz=3
Namespace(bar=None, baz='3', foo='2')
temp $ python test.py 1 2 3
Namespace(bar='2', baz='3', foo='1')

python は、関数呼び出しの類推で次のエラーを表示しますが、argparse はそれを許可します。

temp $ python test.py 1 2 3 --foo=27.5
Namespace(bar='2', baz='3', foo='27.5')

相互に排他的なグループ化を使用することで、おそらくそれを回避できます

于 2013-01-29T14:59:21.767 に答える
1

このモジュールも使用できます: docopt

于 2013-01-29T17:22:54.057 に答える
0

これがあなたが探しているものだと思います

于 2013-01-29T14:58:36.357 に答える