4

Python の argparse に関して質問があります。位置引数を必要としないオプションの引数を指定することは可能ですか?

例:

parser.add_argument('lat', help="latitude")
parser.add_argument('lon', help="longitude")
parser.add_argument('--method', help="calculation method (default: add)", default="add")
parser.add_argument('--list-methods', help="list available methods", action="store_true")

通常のコマンドラインはtest.py 47.249 -33.282ortest.py 47.249 -33.282 --method subです。test.py --list-methodsしかし、使用可能なすべてのメソッドを一覧表示するためにスクリプトを呼び出すとすぐに、error: to few arguments. argparse を使用して、位置引数 (lat、lon) なしでこのオプションの引数 (--list-methods) を取得するにはどうすればよいですか?

4

3 に答える 3

4
  • デフォルト値を設定nargs='?'し、位置引数に
  • リストメソッドモードでないときに緯度経度の両方が設定されていることをコードで手動で確認してください

    parser = argparse.ArgumentParser()
    
    parser.add_argument('lat', help="latitude",default=None, nargs='?')
    parser.add_argument('lon', help="longitude",default=None, nargs='?')
    parser.add_argument('--method', help="calculation method (default: add)", default="add")
    parser.add_argument('--list-methods', help="list available methods", action="store_true")
    
    args = vars(parser.parse_args())
    
    if not args['list_methods'] and (args['lat'] == None or args['lon'] == None):
        print '%s: error: too few arguments' % sys.argv[0]
        exit(0)
    
    if args['list_methods']:
        print 'list methods here'
    else :
        print 'normal script execution'
    

与える:

$ test.py --list-methods
ここにメソッドをリストします

$ test.py 4
test.py: エラー: 引数が少なすぎます

test.py 4 5
通常のスクリプト実行

于 2011-09-20T12:59:59.370 に答える
2

Python 3.3 では、必要なアクションのセットに対してparse_argsそのセットをチェックし、必要に応じてエラーを発行します。以前は、残りのリストをチェックして、エラー メッセージを表示していました。seen_actionsthe following arguments are required...positionalstoo few arguments

したがって、新しいバージョンの場合、このスニペットはあなたが望むことをするはずです:

parser = argparse.ArgumentParser()
lat=parser.add_argument('lat', help="latitude")
lon=parser.add_argument('lon', help="longitude")
parser.add_argument('--method', help="calculation method (default: add)", default="add")

class MyAction(argparse._StoreTrueAction):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, self.const)
        lat.required = False
        lon.required = False

parser.add_argument('--list-methods', help="list available methods", action=MyAction)

通常lat、 とlonは位置指定が必要ですが、--list...アクションが実行されると、それらのアクションは不要になり、欠落していてもエラー メッセージは表示されません。


argparse をカスタマイズするもう 1 つの方法は、複数のパーサーを使用することです。この場合、1 つのパーサーを使用して--list-methodsオプションをチェックし、取得したパーサーに基づいて、ポジショナルを探す別のパーサーを呼び出すことができます。

parser1 = argparse.ArgumentParser(add_help=False)
parser1.add_argument('--list-methods', help="list available methods", action='store_true')

parser2 = argparse.ArgumentParser()
parser2.add_argument('lat', help="latitude")
parser2.add_argument('lon', help="longitude")
parser2.add_argument('--method', help="calculation method (default: add)", default="add")
parser2.add_argument('--list-methods', help="list available methods", action='store_true')
def foo(argv):
    args,rest = parser1.parse_known_args(argv)
    if not args.list_methods:
        args = parser2.parse_args(argv)
    return args

parser2help コマンドに応答します。 parse_known_args可能なものを解析し、残りをリストで返します。 引数としてparser2受け取るように書き込むこともできます。rest, args

于 2013-07-27T07:06:16.450 に答える
-1

引数が必要なerror: to few argumentsためlat、取得します。lon

In [10]: parser.parse_args('--list-methods'.split())
ipython: error: too few arguments

しかし

In [11]: parser.parse_args('--list-methods 10 20'.split())
Out[11]: Namespace(lat='10', list_methods=True, lon='20', method='add')

latおよびlon引数をオプションにする必要があります。

于 2011-07-30T14:19:14.337 に答える