首页 > 解决方案 > 如何使用 Python 的 argparse 模块实现以下功能?:scale_data.py [-h] (-t | -r [Number of Days Back]| -i [Start Date])

问题描述

我正在尝试使用 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 模块完成的?

谢谢你的帮助!

标签: pythonargparse

解决方案


  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", nargs="?", 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=<object>)
Namespace(t=False, r=<object>, i=None)
Namespace(t=False, r=<object>, i='8')

最后一个

error: argument -i: not allowed with argument -t

最后一次测试调用。


推荐阅读