如何解决如何使用 Python 的 argparse 模块实现以下功能?: scale_data.py [-h] (-t | -r [返回天数]| -i [开始日期])
我正在尝试使用 Python 的 argparse 模块。我的名为 scale_data.py 的 Python 脚本将需要使用 3 个可能的互斥开关中的 1 个:
scale_data.py -t
scale_data.py -r
scale_data.py -i
我已经想出了如何使用“add_mutually_exclusive_group”来实现这一点。我的问题是我希望 -r 开关或 -i 开关在它们之后有可选参数:
scale_data.py -r 20
scale_data.py -i 02/01/2021
但不需要参数。
我假设的帮助看起来像这样:
scale_data.py [-h] (-t | -r [Number of Days Back]| -i [Start Date])
这是如何使用 Python argparse 模块完成的?
感谢您的帮助!
解决方法
- 将您的选项添加到互斥组。
- 将
nargs
设置为"?"
以允许零个或一个参数。 - 将可选参数选项的
default
值设置为不是None
的值;我只是在下面构建一个独特的哨兵对象。这显然是与"?"
nargs 一起使用的互斥检查所必需的。
import argparse
NOTSET = object()
def main(argv):
ap = argparse.ArgumentParser()
ag = ap.add_mutually_exclusive_group()
ag.add_argument("-t",action="store_true")
ag.add_argument("-r",nargs="?",default=NOTSET)
ag.add_argument("-i",default=NOTSET)
print(ap.parse_args(argv))
if __name__ == '__main__':
main(["-t"])
main(["-r","23"])
main(["-i"])
main(["-i","8"])
main(["-t","-i","8"])
打印出来
Namespace(t=True,r=<object>,i=<object>)
Namespace(t=False,r='23',i=None)
Namespace(t=False,i='8')
最后一个
error: argument -i: not allowed with argument -t
最后一次测试调用。
,这是我最终使用@AKX 的答案创建的最终代码...
#!/usr/bin/python3
import argparse
def main():
scale_data_parser = argparse.ArgumentParser(description='Get Withings Scale Data,Process Data,Populate DB,Generate Graphs and Reports.')
mutually_exclusive_group = scale_data_parser.add_mutually_exclusive_group(required=True)
mutually_exclusive_group.add_argument('-t',action='store_true',help='Fetch recent records then wait for trigger')
mutually_exclusive_group.add_argument('-r',nargs='?',default=False,dest='Number Of Days Back',help='Fetch recent records then refresh all ouputs [Number Of Recent Days To Output (Int)]')
mutually_exclusive_group.add_argument('-i',dest='Start Date',help='Fetech all records and completely reinitialize the database to the latest date as Start Date [Use This Start Date Instead (Date MM/DD/YYYY)]')
scale_data_arguments = vars(scale_data_parser.parse_args())
if scale_data_arguments['t']:
print('(-t) Switch With No Arguments')
elif scale_data_arguments['Number Of Days Back'] is None:
print('(-r) Switch With No Arguments')
elif scale_data_arguments['Number Of Days Back'] is not None and scale_data_arguments['Number Of Days Back'] is not False:
print(f'(-r) Switch With An Argument ({scale_data_arguments["Number Of Days Back"]})')
elif scale_data_arguments['Start Date'] is None:
print('(-i) Switch With No Arguments')
elif scale_data_arguments['Start Date'] is not None and scale_data_arguments['Start Date'] is not False:
print(f'(-i) Switch With An Argument ({scale_data_arguments["Start Date"]})')
if __name__ == '__main__':
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。