支持 argparse 中子命令之前或之后的全局参数

2023-12-05

设置parents与解析器的参数将允许在解析器之间共享公共参数 (e.g. 父命令和子命令)。但是,当使用已指定 value 属性的参数时,将基本解析器应用于父命令和子命令似乎会用子命令解析器的值覆盖父解析器的值。dest关键字,无论调用是否在子命令中指定了参数。

我该如何使用argparse module合并父命令和子命令中的选项(即,如果任一解析器包含该选项,则存储值;如果两个解析器都没有指定该选项,则使用默认值;如果两个解析器都指定该选项,则如何处理并不重要) ?

sample.py:

from argparse import ArgumentParser
parser = ArgumentParser(add_help=False) # The "base"
parser.add_argument('-v', '--verbose', dest='verbose', action='store_true')
parser.add_argument('-d', '--dir', dest='dir', default=None)

parser_main = ArgumentParser(parents=[parser])
subparsers = parser_main.add_subparsers(dest='command')
subparsers.add_parser('cmd1', parents=[parser])
args = parser_main.parse_args()

print(str(args))

然后,在外壳中:

> sample.py -v -d abc
Namespace(command=None, dir='abc', verbose=True)
> sample.py -v cmd1 -d abc
Namespace(command='cmd1', dir='abc', verbose=False)
> sample.py -d abc cmd1 -v
Namespace(command='cmd1', dir=None, verbose=True)
> sample.py cmd1 -v -d abc
Namespace(command='cmd1', dir='abc', verbose=True)

Using SUPPRESS对于子解析器默认值,它不会覆盖父解析器值。 ASUPPRESS默认不插入namespace在解析开始时。仅当用户使用该参数时才会写入值。

import argparse    
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo', default='foobar')
parser.add_argument('-v', '--verbose', action='store_const', default=False, const=True)

sp = parser.add_subparsers(dest='cmd')
sp1 = sp.add_parser('cmd1')
sp1.add_argument('-f', '--foo', default=argparse.SUPPRESS)
sp1.add_argument('-v', '--verbose', action='store_const', default=argparse.SUPPRESS, const=True)

args = parser.parse_args()
print(args)

样本运行:

1833:~/mypy$ python3 stack62904585.py
Namespace(cmd=None, foo='foobar', verbose=False)
1834:~/mypy$ python3 stack62904585.py --foo FOO -v
Namespace(cmd=None, foo='FOO', verbose=True)
1834:~/mypy$ python3 stack62904585.py cmd1 
Namespace(cmd='cmd1', foo='foobar', verbose=False)
1834:~/mypy$ python3 stack62904585.py -v cmd1 -f bar
Namespace(cmd='cmd1', foo='bar', verbose=True)

最后更改此行为的补丁 (2014)

https://bugs.python.org/issue9351子命令上的 argparse set_defaults 应覆盖顶级 set_defaults

also https://bugs.python.org/issue27859

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

支持 argparse 中子命令之前或之后的全局参数 的相关文章

随机推荐

  • ui-router 默认子状态不起作用

    我正在测试UI Router嵌套状态 但我无法在父 子场景中设置默认状态 请帮助 图书馆 角度 1 3 15 用户界面路由器 0 2 15 导航路径 home settings parent state page settings defa
  • 如何在约束布局上实现重叠/负边距?

    是否可以在约束布局上实现负边距以实现重叠 我试图让图像以布局为中心 并有一个文本视图 使其与 x dp 重叠 我尝试设置负保证金值 但没有成功 如果有办法实现这一点那就太好了 Update 约束布局现在版本 2 1 0 alpha2 支持负
  • 从一个函数返回不同维度的数组;在 F# 中可以吗?

    我正在尝试将一些 Python 转换为 F 特别是numpy random randn 该函数采用可变数量的 int 参数 并根据参数的数量返回不同维度的数组 我相信这是不可能的 因为不能有一个返回不同类型的函数 int int int 等
  • 使用代码更新故事板约束

    我有一个UIImage在代码中 我想在按下按钮时垂直放大 这UIImage完全限制在故事板中 我想在按下按钮时更改其高度 我已经链接了UIImage及其在代码中的高度约束 IBOutlet weak var botBotCons NSLay
  • 当我不将 .Save() 的位图 .Dispose() 保存到 MemoryStream 时,为什么会出现内存泄漏?

    假设我创建了一个位图 Bitmap bitmap new Bitmap 320 200 当我将其写入某个流时 在我的例子中 它是一个 HttpResponseStream 由 HttpListenerResponse 给出 一切都很好 bi
  • Java机器人类mouseMove不去指定的位置

    老实说 我不完全确定出了什么问题 这是 if 和 if else 下的大量其他基本机器人命令动作的简短版本 每当我运行该程序时 鼠标应移动到指定位置并单击 但是 当我运行程序时 它不会移动到我指示的位置 而是每次运行时它都会移动到不同的位置
  • 将大型 Git 存储库拆分为许多较小的存储库

    成功将 SVN 存储库转换为 Git 后 我 现在拥有一个非常大的 Git 存储库 我想将其分解为多个较小的存储库并维护历史记录 那么 有人可以帮助分解可能如下所示的存储库 MyHugeRepo git DIR A DIR B DIR 1
  • 如何在wpf中实现主题化

    我想在 WPF 中实现 ASP Net 类型主题 用户可以选择各种预定义主题 并且可以切换到另一个主题 为了实现这一点 我尝试为每个主题创建不同的资源字典 并使用键存储所需的样式 所有主题中的键集合都是相同的 但每个主题的定义都不同 我使用
  • 将矩阵中每个等于 0 的元素替换为上一行的相应元素

    我正在使用 R 我有一个矩阵 我想用上面行的相应元素替换它等于零的每个元素 例如 我创建了以下矩阵 AA lt matrix c 1 2 3 1 4 5 1 0 2 ncol 3 nrow 3 1 2 3 1 1 1 1 2 2 4 0 3
  • 如何在两个 Android 应用之间共享应用内购买

    我有两个 Android 应用程序 app1 和 app2 它们都是免费的 但 app2 包含应用程序内购买升级 现在我要将这两个应用程序合并到 app1 没有应用内购买的应用程序 中 我的问题是 如何保留已在 app2 中消费的购买 以便
  • 使用 set_xlim() 切片图后 matplotlib autoscale(axis='y')

    作为演示 我绘制了 x 0 到 x 9 其中 x 值的范围为 10 到 20 然后我对这些图像进行切片 得到 9 个切片 x 10 到 11 11 到 12 等等到 18 到 19 我希望裁剪图像 以便 y 值始终在每个切片中从上到下分布
  • CSS3 可以添加文本渐变吗?

    我正在寻找在文本中添加渐变 网络图们有一个快速提示关于那个 但它仅适用于 webkit 浏览器 由于这是相当老的帖子 我正在检查是否有任何跨浏览器解决方案 忽略 ie 我知道如何使用背景渐变图像 我知道在 Firefox 中实现此功能的唯一
  • 子属性的 JSON .NET 自定义名称解析器

    我有一个 API 它从 MongoDB 返回一个 JSON 对象 其中属性之一是 开放式 文档 这意味着它可以是any该属性的有效 JSON 我事先不知道属性的名称是什么 它们可以是任何字符串 我只知道这个特定的属性需要序列化exactly
  • 从通知中删除声音

    我正在尝试创建一个 UISwitch 以便用户可以选择不从应用程序内部获取推送声音 是否可以 我尝试再次注册但没有声音 void registerToNotificationWithoutSound if UIDevice currentD
  • React-big-calendar 导入 CSS 失败

    我的反应大日历工作正常 但 css 导入失败 文档说 样式可以在 react big calendar lib css react big calendar css 中找到 并且应该包含在带有日历组件的页面上 我在其他示例中看到它是通过 B
  • 在 Visual Studio 中更改 ctrl k+c 以生成 c 样式注释 (/**/) 而不是 c++ 样式注释 (//)

    如何更改 Visual Studio 中使用的注释样式 to 我使用注释快捷方式主要是为了临时注释掉代码 令我烦恼的是 如果我选择bool abc在下面的代码中并按 ctrl k c void func bool abc 它产生 void
  • 尝试引用工作表中的复选框时出现“需要对象”错误

    我正在尝试在 Excel VBA 中编写代码 我想在选中复选框时更改用户选择的单元格的颜色 我已经编写了这段代码 但它在标记的行上给出了 需要对象 错误 Sub CheckBox1 Click Dim xRng As Range Set x
  • 如何按顺序排序兄弟姐妹?

    我正在使用 PostgreSQL 9 1 6 并尝试构建递归 SQL 我想排序ORDER SIBLINGS BY在 SQL Server 中就是这样做的 Editor s note This is probably supposed to
  • 打字稿中的数组类型

    为什么 TypeScript 允许这样做 我指定了一个数字索引 为什么可以使用字符串作为索引 Visual Studio 不报告错误 interface StringArray index number string var a Strin
  • 支持 argparse 中子命令之前或之后的全局参数

    设置parents与解析器的参数将允许在解析器之间共享公共参数 e g 父命令和子命令 但是 当使用已指定 value 属性的参数时 将基本解析器应用于父命令和子命令似乎会用子命令解析器的值覆盖父解析器的值 dest关键字 无论调用是否在子