允许在子命令后使用 argparse 全局标志

2023-12-28

我正在使用 argparse 构建带有子命令的命令:

mycommand [GLOBAL FLAGS] 子命令 [FLAGS]

我希望全局标志无论在子命令之前还是之后都可以工作。有没有一种干净的方法来做到这一点而不涉及重复代码?

例如:

  parser = argparse.ArgumentParser()
  subparsers = parser.add_subparsers(dest='subparser_name')

  parser.add_argument('--disable')    # This flag...

  sp = subparsers.add_parser('compile')
  sp.add_argument('zones', nargs='*')
  sp.add_argument('--disable')        # Is repeated...

  sp = subparsers.add_parser('launch')
  sp.add_argument('zones', nargs='*')
  sp.add_argument('--disable')        # over and over...

我想对许多标志执行此操作,因此一遍又一遍地重复自己似乎......不符合Python标准。


这是一个完美的用例parents https://docs.python.org/2/library/argparse.html#parentsargparse 功能:

有时,多个解析器共享一组公共参数。相当 与重复这些参数的定义相比,单个解析器 与所有共享参数并传递给parents=参数 可以使用ArgumentParser。

定义一个基础父级ArgumentParser,添加将在子解析器之间共享的参数。然后,添加子解析器并通过提供将基本解析器设置为父解析器parents关键字参数:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subparser_name')

base_subparser = argparse.ArgumentParser(add_help=False)
# define common shared arguments
base_subparser.add_argument('--disable')

sp = subparsers.add_parser('compile', parents=[base_subparser])
# define custom arguments
sp = subparsers.add_parser('launch', parents=[base_subparser])
# define custom arguments

注意add_help=False这有助于避免出现问题矛盾的help争论 https://stackoverflow.com/questions/18839957/argparseargumenterror-argument-h-help-conflicting-option-strings-h.

另请参阅:Python argparse - 向多个子解析器添加参数 https://stackoverflow.com/questions/7498595/python-argparse-add-argument-to-multiple-subparsers.

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

允许在子命令后使用 argparse 全局标志 的相关文章

随机推荐

  • WPF:Content 和 DataContext 属性之间有什么区别?

    据我了解 DataContext property 控件使用此属性作为数据源 是每个框架元素都具有的属性 可用于将数据流入屏幕 DataContext 有范围 范围是根据 DataContext 在对象树中分配到的位置来建立的 如果您在父元
  • 如何影响部分卷页呈现的模态视图的大小?

    我需要为应用程序中的视图提供一些附加数据 并且我想使用部分页面卷曲来实现它 就像 Google 地图应用程序使用部分页面卷曲进行设置一样 我遇到的问题是所呈现的视图占据了整个屏幕 如何调整所呈现视图的大小 理想情况下 我希望它像 Googl
  • 如何渲染 OSM 瓷砖

    我想设置一个瓷砖服务器 我在网上找到了一些文档并遵循本教程 https switch2osm org serving tiles manually building a tile server 14 04 现在看来我有一个配置良好的服务器
  • JavaScript atan2() 函数未给出预期结果

    通常 极坐标从 0 到 到 2 实际上就在 2 之前 因为它又等于 0 然而 当使用 JavaScriptatan2 函数 我得到了一个不同的 奇怪的范围 Cartesian X Cartesian Y Theta 1 0 0 0 1 1
  • 运行我自制的旋转算法时得到不正确的图片输出

    为了更好地理解图像处理的工作原理 我决定创建自己的图像旋转算法 而不是使用 cv2 rotate 但是 我遇到了奇怪的图片裁剪和像素错位问题 我认为这可能与我的填充有关 但也可能有其他错误 import cv2 import math im
  • 在 MATLAB 中循环内部绘图

    我正在做这样的事情 a 1 100 for i 1 100 plot 1 i a 1 i end 我的问题是 直到循环完成后才会显示绘图 如何在每次迭代中显示 更新绘图 Use DRAWNOW http www mathworks com
  • 使用 Aurelia 的 Fetch Client 时 Azure Translator API(认知服务)上出现 CORS 错误

    我尝试使用来自 Windows Azure 的非常基本的 API 调用来翻译一些文本 他们给出了一个快速入门示例代码 https learn microsoft com en us azure cognitive services tran
  • WPF - 应用前景时默认按钮禁用样式

    按钮应用了一个Foreground当它被启用时 如果设置为Disabled 则默认Button为DisabledForeground需要申请
  • 按值传递 vs 按引用传递(两者之间内存空间分配的差异)

    在 C 中 我们使用引用传递 我们引用从参数传递到函数参数的任何地址 这本质上是一个指针 对吗 因此 虽然它们本质上是相同的东西 别名等等 但指针不是也需要内存空间吗 因此 无论我们在参数函数中拥有什么 都不应该让我们调用 B 指向所传递的
  • 多维数组符号之间的差异(object[][] 和 object[])

    我想知道在 C 中定义多维数组的两种方法有什么区别 您可以使用object and object 处理多维数组 功能上有区别吗 The object 是数组数组的表示法 第二个object 是一个二维数组 主要区别是第一个可以包含不同长度的
  • angularJS ng-model 输入类型号到 rootScope 未更新

    我的输入类型编号设置为
  • C# Decimal.GetHashCode() 和 Double.GetHashCode() 相等

    为什么会这样17m GetHashCode 17d GetHashCode m 十进制 d 双精度 另外 正如预期的那样17f GetHashCode 17d GetHashCode f 浮点数 对于 net3 5 和 net4 0 来说似
  • CSS悬停图像位置更改

    我确信这是超级愚蠢的事情 但现在我已经被困了一段时间 所以 我在网站上有图像 我希望它们在悬停时稍微移动 所以我在 HTML 中有 a href someaddress img class thumb src somefile a 在 CS
  • Dart SDK未配置

    我安装了 Flutter 并设置了 Android Studio 然后我在 GitHub 上克隆了一个 flutter 的示例 https github com flutter flutter https github com flutte
  • Linux 中的 Qt 线程问题

    我在我的项目中使用 Qt 进行开发已经有一段时间了 我们开始转向更加面向线程的设计 在将一些 GL 渲染小部件移动到其他线程后 我发现了一些非常奇怪的行为 看起来 如果 GL Widget 在接受用户输入的小部件 例如 QTextEdit
  • Android:如何加载PDF?

    有没有办法从浏览器或 WebView 中的 Asset URL 或任何其他方式加载 PDF 文件 目前还没有本地方法可以做到这一点 但是 您可以编写自己的 pdf 查看器活动 另外 请查看复制Go阅读器 http www cerience
  • 在 git 交互式变基期间添加了新文件,变基中止,新文件丢失

    我之前在几个节点上提交了 git rebase i 我添加了一些我打算添加到该提交中的新文件 看起来我在错误的节点上 所以我立即执行了 git rebase abort 这些新文件现在完全消失了 在引用日志中 看起来像是发出了删除命令 删除
  • Telegram markdown 语法:粗体 * 和 * 斜体? (2018年9月)

    通过查看Telegram 的 Markdown 语法 Wiki 页面 https sourceforge net p telegram wiki markdown syntax 创建文本应该相对容易粗体和斜体 在那里 它说 this is
  • Vuex Store 模块访问状态

    我想知道如何从另一个文件访问模块存储 状态 到目前为止 这是我的代码 store index js import Vuex from vuex import categories from modules categories Vue us
  • 允许在子命令后使用 argparse 全局标志

    我正在使用 argparse 构建带有子命令的命令 mycommand GLOBAL FLAGS 子命令 FLAGS 我希望全局标志无论在子命令之前还是之后都可以工作 有没有一种干净的方法来做到这一点而不涉及重复代码 例如 parser a