如何使用 Python 的 argparse 模块实现以下功能?: scale_data.py [-h] (-t | -r [返回天数]| -i [开始日期])

如何解决如何使用 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 模块完成的?

感谢您的帮助!

解决方法

  1. 将您的选项添加到互斥组。
  2. nargs 设置为 "?" 以允许零个或一个参数。
  3. 将可选参数选项的 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?