python – argparse条件参数结构

python – argparse条件参数结构,第1张

概述我想使用argparse,因此提供的参数数量决定了执行哪个子例程. 例如,在下面的脚本中,我希望argparse能够执行以下 *** 作: dmsconvert.py 12.5>>> (12, 30, 0)dmsconvert.py 12 30 0.0>>> 12.5 相反,我能用argparse做到这一点的唯一方法是有一个明确的选项,即: dmsconvert.py 12.5>>> (12, 我想使用argparse,因此提供的参数数量决定了执行哪个子例程.

例如,在下面的脚本中,我希望argparse能够执行以下 *** 作:

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

相反,我能用argparse做到这一点的唯一方法是有一个明确的选项,即:

dmsconvert.py 12.5>>> (12,0)dmsconvert.py -a 12 30 0.0>>> 12.5

任何人都可以建议使用argparse实现我的首选方法吗?
注意:我希望自动生成的argparse帮助文本看起来合理.

完整代码示例:

import argparseimport sysdef 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),secparser = 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'])
解决方法 它可以通过自定义 *** 作完成:

import argparseclass OneOrThree(argparse.Action):    def __call__(self,parser,namespace,values,option_string=None):        if len(values) == 1:            setattr(namespace,self.dest,values)            setattr(namespace,'result',decimal_to_dms(*values))        elif len(values) == 3:            setattr(namespace,dms_to_decimal(*values))        else:            raise parser.error('Expected 1 or 3 arguments')def dms_to_decimal(deg,minute,sec):    assert float(minute) < 60.0,'Mintue value: %s must be less than 60' % float(minute)    assert float(sec) < 60.0,'Second value: %s must be less than 60' % float(sec)    return float(deg)+float(minute)/60.0+float(sec)/(60.0*60.0)def decimal_to_dms(deg):    minute = 60.0*(deg-int(deg))    sec = 60.0*(minute-int(minute))    return int(deg),int(minute),secparser = argparse.ArgumentParser(    usage='%(prog)s deg [minute,sec]',)parser.add_argument('dms_args',nargs='+',action=OneOrThree,Metavar='deg [minute,help='Given one arg,returns dms. Given three args,returns deg')args = parser.parse_args()print(args.result)

运行上面的行为会产生如下行为:

% test.py 12.5(12,0.0)% test.py 12 30 0.012.5

如果提供的参数数量不正确,则会引发错误:

% test.py 12 30usage: test.py [-h] dms_args [dms_args ...]test.py: error: Expected 1 or 3 arguments

帮助消息如下所示:

% test.py -husage: test.py deg [minute,sec]positional arguments:  deg [minute,sec]  Given one arg,returns degoptional arguments:  -h,--help         show this help message and exit
总结

以上是内存溢出为你收集整理的python – argparse条件参数结构全部内容,希望文章能够帮你解决python – argparse条件参数结构所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1196886.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存