4

argparse を使用して、提供された引数の数によって実行されるサブルーチンが決定されるようにしたいと考えています。

たとえば、以下のスクリプトでは、argparse で次のことを実行できるようにしたいと考えています。

dmsconvert.py 12.5
>>> (12, 30, 0)

dmsconvert.py 12 30 0.0
>>> 12.5

代わりに、argparse でこれを行うことができた唯一の方法は、明示的なオプションを使用することです。つまり、次のようになります。

dmsconvert.py 12.5
>>> (12, 30, 0)

dmsconvert.py -a 12 30 0.0
>>> 12.5   

argparseを使用して私の好みのアプローチを実現する方法を誰かが提案できますか? 注: 自動生成された argparse ヘルプ テキストが適切に見えるようにしたいと考えています。

完全なコード例:

import argparse
import sys

def dms_to_decimal(deg,min,sec):
    assert float(min) < 60.0, 'Mintue value: %s must be less than 60' % float(min)
    assert float(sec) < 60.0, 'Second value: %s must be less than 60' % float(sec)
    return float(deg)+float(min)/60.0+float(sec)/(60.0*60.0)

def decimal_to_dms(deg):
    min = 60.0*(deg-int(deg))
    sec = 60.0*(min-int(min))
    return int(deg),int(min),sec

parser = argparse.ArgumentParser(description = 'Convert decimal degrees to dms and visa versa')
parser.add_argument('-a',dest='dms_args',nargs=3)
parser.add_argument(dest='dec_arg',type=float,nargs='?')
args = vars(parser.parse_args(sys.argv[1:]))

if args['dms_args'] is not None:
    print dms_to_decimal(*args['dms_args'])

if args['dec_arg'] is not None:
    print decimal_to_dms(args['dec_arg'])
4

1 に答える 1