python - 如何使用 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 模块完成的?
谢谢你的帮助!
解决方案
- 将您的选项添加到互斥组。
- 设置
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", 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
最后一次测试调用。
推荐阅读
- c# - 文件夹未复制到输出目录
- javascript - 遍历对象其中值是对象数组并从对象数组的每个对象返回一个值
- python - 按索引值有条件地填充部分填充的熊猫数据框
- reactjs - react-native-fs 中的编译错误
- git - GitHub 上的软件版本中出现多个 Git 标签
- security - DB2 查询中的 IF 和 ELSE 条件以显示输出
- java - 在 PayPal REST API 中查找 Braintree BillingAgreement ID
- c++ - 构造函数是否有现代 C++ 方式来了解其“容器”类?
- c++ - 如何在不硬编码数组大小的情况下在类的初始化器列表中初始化 std::array
- regex - Raku/Perl6:如何限制匹配方法以捕获组?