如何从父解析器获取 argparse 子解析器(以检查默认值)

2023-12-06

假设我创建一个具有参数默认值的解析器,然后为其提供一个具有进一步参数默认值的子解析器。

In [1]: parser = argparse.ArgumentParser(description='test')

In [2]: parser.add_argument("--test", dest="test", default="hello")
Out[2]: _StoreAction(option_strings=['--test'], dest='test', nargs=None, const=None, default='hello', type=None, choices=None, help=None, metavar=None)

In [3]: parser.get_default("test")
Out[3]: 'hello'

In [4]: subparsers = parser.add_subparsers(dest="command")

In [5]: parser_other = subparsers.add_parser("other")

In [6]: parser_other.add_argument("--other-test", dest="other_test", default="world")
Out[6]: _StoreAction(option_strings=['--other-test'], dest='other_test', nargs=None, const=None, default='world', type=None, choices=None, help=None, metavar=None)

In [7]: parser_other.get_default("other_test")
Out[7]: 'world'

这一切都很好。但是假设我有一个创建并返回父解析器的函数parser从上面,但无法直接访问子解析器。

我怎样才能打印出子解析器参数的默认值?或者分别获取每个子解析器的句柄?

In [8]: parser._subparsers._defaults
Out[8]: {}

In [9]: parser._subparsers.get_default("other_test")  # is None

似乎没有更多的属性或方法parser._subparsers或来自parser可以显示默认值。

总体问题是:当您只有父解析器的句柄时,如何以编程方式访问子解析器默认值?


你做对了。但也许我可以解释一些细节。

a = parser.add_argument(...)

add_argument创建一个Action对象(或者实际上是一个子类,具体取决于action范围)。您可以在自己的环境中保存指向该对象的指针。但该 Action 也收集在parse._actions列表。就是这样的parser记录其论点。

Reading _actions应该永远是安全的。修改它可能会破坏解析器。argument_groups有权访问该列表。

subparsers = parser.add_subparsers(dest="command")

是一个专门版本add_argument,创建并返回一个argparse._SubParsersAction目的。subparsers是那个物体。正如之前的答案所述,您可以在_actions通过搜索正确的子类来列出。 (对于主解析器,subparsers只是另一个位置参数。)

subparsers维护自己的专业词典parsers,可作为其访问choices属性。主解析器没有这些子解析器的任何记录。

parser_other = subparsers.add_parser("other")

创建一个解析器,将其放入其中choices映射,并返回一个引用供您自己使用(带有add_argumentETC)。每个子解析器都有自己的_actions列表。 (以及它自己的_defaults).

查看代码get_defaults method:

def get_default(self, dest):
    for action in self._actions:
        if action.dest == dest and action.default is not None:
            return action.default
    return self._defaults.get(dest, None)

它使用_actions属性。并看着action.default动作的属性。

self._defaults字典是由parser.set_defaults方法。该方法还将其参数复制到相关的 Action 对象。get_defaults检查万一dest是与特定操作无关的默认值之一。https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.set_defaults

我没用过parser._subparsers属性多。看着parser.add_subparsers方法我看到它实际上是一个argument_group。 Argument_groups 主要是help工具,用于对帮助热线进行分组。解析器对象与其 argument_groups 之间的关系有点棘手,可能不是您想要使用的。


这是一个包含更多(太多)细节的示例:

In [22]: parser = argparse.ArgumentParser()
In [23]: sp = parser.add_subparsers(title='subparsers', dest='cmd')
In [24]: sp1 = sp.add_parser('cmd1')
In [25]: sp2 = sp.add_parser('cmd2')
In [26]: parser.print_help()
usage: ipython3 [-h] {cmd1,cmd2} ...

optional arguments:
  -h, --help   show this help message and exit

subparsers:
  {cmd1,cmd2}

In [28]: [a.dest for a in parser._actions]
Out[28]: ['help', 'cmd']

In [29]: parser._action_groups
Out[29]: 
[<argparse._ArgumentGroup at 0xaf86bf2c>,
 <argparse._ArgumentGroup at 0xaf86bdcc>,
 <argparse._ArgumentGroup at 0xac99fa6c>]
In [30]: [g.title for g in parser._action_groups]
Out[30]: ['positional arguments', 'optional arguments', 'subparsers']

In [31]: parser._subparsers
Out[31]: <argparse._ArgumentGroup at 0xac99fa6c>

The _defaults of _subparsers实际上是同一个字典parser._defaults

In [32]: parser.set_defaults(extra='foobar')
In [33]: parser._defaults
Out[33]: {'extra': 'foobar'}
In [34]: parser._subparsers._defaults
Out[34]: {'extra': 'foobar'}

parser._subparsers._actions也与parser._actions。但该组确实维护自己的列表操作(在帮助显示中使用)。

In [35]: parser._subparsers._group_actions
Out[35]: [_SubParsersAction(option_strings=[], dest='cmd', nargs='A...', const=None, 
    default=None, type=None, choices=OrderedDict([...]), help=None, metavar=None)]

所以你可以使用parser._subparsers._group_actions[0]找到subparsers动作对象而不是搜索parsers._actions list.

In [37]: parser._subparsers._group_actions[0].choices
Out[37]: 
OrderedDict([('cmd1',
              ArgumentParser(prog='ipython3 cmd1', usage=None, description=None,...)),
             ('cmd2',
              ArgumentParser(prog='ipython3 cmd2', usage=None, description=None,...))])

再一想,parser._subparsers._group_actions可能没那么有用。如果你不给它一个特殊的标题,那么它与parser._positionals,所有位置参数的参数组。所以你仍然需要验证_SubParsersAction class.

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

如何从父解析器获取 argparse 子解析器(以检查默认值) 的相关文章

  • 通过 boto3 承担 IAM 用户角色时访问被拒绝

    Issue 我有一个 IAM 用户和一个 IAM 角色 我正在尝试将 IAM 用户配置为有权使用 STS 承担 IAM 角色 我不确定为什么收到 访问被拒绝 错误 Details IAM 角色 arn aws iam 123456789 r
  • Flask中使用的路由装饰器是如何工作的

    我熟悉 Python 装饰器的基础知识 但是我不明白这个用于 Flask 路由的特定装饰器是如何工作的 以下是 Flask 网站上的代码片段 from flask import Flask escape request app Flask
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • 如何为未捕获的异常处理程序编写单元测试

    我有一个函数可以捕获uncaught例外情况 如下 有没有办法编写一个单元测试来执行uncaught exception handler 功能正常 但测试正常退出 import logging def config logger logge
  • 数据框 - 平均列

    我在 pandas 中有以下数据框 Column 1 Column 2 Column3 Column 4 2 2 2 4 1 2 2 3 我正在创建一个数据框 其中包含第 1 列和第 2 列 第 3 列和第 4 列等的平均值 ColumnA
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 以类型化内存视图作为成员的结构定义

    目前我正在尝试让一个具有类型化内存视图的结构能够工作 例如 ctypedef struct node unsigned int inds 如果 inds 不是内存视图 据我所知 它可以完美地工作 然而 通过内存视图并使用类似的东西 def
  • 用于(联合国)结构化文本文档的词法分析器/解析器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有很多脚本解析器和词法分析器 即结构化计算机语言 但我正在寻找一个可以将 几乎 非结构化文本文档分成更
  • Python MySQL 操作错误:1045,“用户 root@'localhost' 的访问被拒绝

    我试图通过以下方式从我的 python 程序访问数据库 db mysql connect host localhost user Max passwd maxkim db TESTDB cursor db cursor 但是 我在第一行代码
  • Python“非规范化”unicode 组合字符

    我正在寻找标准化 python 中的一些 unicode 文本 我想知道是否有一种简单的方法可以在 python 中获得组合 unicode 字符的 非规范化 形式 例如如果我有序列u o xaf i e latin small lette
  • PIL.Image.open和tf.image.decode_jpeg返回值的区别

    我使用 PIL Image open 和 tf image decode jpeg 将图像文件解析为数组 但发现PIL Image open 中的像素值与tf image decode jpeg不一样 为什么会出现这种情况 Thanks 代
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • Flask 应用程序路由中的多个参数

    烧瓶怎么写app route如果我在 URL 调用中有多个参数 这是我从 AJax 调用的 URL http 0 0 0 0 8888 createcm summary VVV change Feauure 我试图写我的烧瓶app rout
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • numpy polyfit 中使用的权重值是多少以及拟合误差是多少

    我正在尝试对 numpy 中的某些数据进行线性拟合 Ex 其中 w 是该值的样本数 即对于点 x 0 y 0 我只有 1 个测量值 该测量值是2 2 但对于这一点 1 1 我有 2 个测量值 值为3 5 x np array 0 1 2 3
  • 非法指令:MacOS High Sierra 上有 4 条指令

    我正在尝试在 pygame 3 6 中制作一个看起来像聊天的窗口 我刚刚将我的 MacBook 更新到版本 10 13 6 在我这样做之前它工作得很好 但在我收到消息之后 非法指令 4 Code import pygame from pyg
  • 在matlab中,如何读取python pickle文件?

    在 python 中 我生成了一个 p 数据文件 pickle dump allData open myallData p wb 现在我想在Matlab中读取myallData p 我的Matlab安装在Windows 8下 其中没有Pyt
  • django jet 中的自定义徽标

    我目前正在尝试对 django 管理面板的皮肤进行一些定制 以使其更符合我们的品牌 目前我们使用 django jet 来美化管理面板 django jet 可以自定义 css html 吗 所有评论都说我应该更改一些 html 文件 但我
  • Jupyter Notebook:带有小部件的交互式绘图

    我正在尝试生成一个依赖于小部件的交互式绘图 我遇到的问题是 当我使用滑块更改参数时 会在前一个绘图之后完成一个新绘图 而我预计只有一个绘图会根据参数发生变化 Example from ipywidgets import interact i

随机推荐

  • 卡夫卡|增加多个主题的复制因子

    我有一个 3 代理 Kafka 集群 其中有许多主题 复制因子为 1 我知道我可以通过将带有分区重新分配配置的 JSON 文件传递 给kafka reassign partitions sh 我的困惑是 我应该传递一个包含所有主题的分区重新
  • 两个数相除[重复]

    这个问题在这里已经有答案了 我正在用 C 进行一些自学 虽然我做了比这更复杂的项目 但我无法弄清楚问题是什么 private void button4 Click object sender EventArgs e int headcoun
  • 在 Javafx Tableview 中选择行

    根据我上面的表格视图 一旦我单击任何操作图标 它将导航到另一个窗口 包含选定的数据 当再次返回到此表视图时 我如何保持选择同一行 谢谢 很抱歉实际上我已经复制了question 正确答案就在那里 Platform runLater new
  • Observable.combineLatest 不是一个函数

    我有一个Home页面 用户点击其中的某个位置联络我被重定向到Contact page home component html div a Contact me a div home component ts import Component
  • 用Java复制和移动文件,不同方法的解释和比较

    我实现了一个文件操作功能 并且我注意到 Java 提供了多种复制和移动文件的技术 您可以在下面找到代码片段 简要描述这些方法 方法 1 File from new File src getPath File to new File dst
  • swift 编译器显示预期声明错误? [复制]

    这个问题在这里已经有答案了 当这段代码被写成AllListViewController并运行 编译器显示预期声明错误 for list in lists let item ChecklistItems item text Item for
  • ROCm 和 CUDA GPU 在一种型号上?

    我想在多个 GPU 上编译模型 是否可以在同一型号上将带有 ROCm 的 AMD GPU 与 Nvidia CUDA GPU 一起使用 我想这是不可能的 因为您需要安装特殊版本的tensorflow才能启用ROCm tensorflow N
  • 列名称或提供的值的数量与表定义不匹配 - 无法识别根本原因

    出现错误 cmd ExecuteNonQuery 我当前的代码 Using con As New SqlConnection sConString Using cmd As New SqlCommand INSERT INTO MC Ent
  • 找不到参数编组器的隐式值:spray.httpx.marshalling.ToResponseMarshaller

    我在用着 val akkaV 2 2 3 val sprayV 1 2 0 Seq io spray spray can sprayV io spray spray routing sprayV io spray spray json 1
  • 泛型结构的构造函数中出现“预期类型参数”错误

    我正在尝试将活塞纹理存储在结构中 struct TextureFactory
  • HXT:以纯代码读取 HTML 并将其写入字符串时的令人惊讶的行为

    我想从字符串中读取 HTML 对其进行处理并使用 HXT 将更改后的文档作为字符串返回 由于此操作不需要 IO 我宁愿执行箭头runLA比与runX 代码如下所示 为了简单起见 省略了处理 runLA hread gt gt gt writ
  • Elasticsearch 聚合结果分页

    我想使用 Elasticsearch 聚合查询的 size 和 from 属性进行分页 这可能吗 目前我只知道 size 属性 0 以获得无限结果 聚合分页功能尚未实现 您可以使用尺寸组合并排除构面中的特征
  • 将 RegEx 从 JavaScript 转换为 Java

    好的 所以我尝试用不在 或 内的 分割字符串 我有一个适用于 JavaScript 的正则表达式 但无法将其转换为 Java 语法 JS 正则表达式 g 例句 ex1 ex2 ex3 ex 4 ex 4 ex ex 当我尝试在 Java 中
  • .htaccess 301 重定向不起作用?

    我的根目录中有一个 page1 html 形式的静态页面 根目录中还有另一个页面 index php 我想做的是将所有旧的传入链接移动到指向 WordPress 目录 我通过 htaccess 和 index php 获得了要重定向的主域
  • PHP中如何将数字转换为字母?

    这个函数 numtoalpha 如何打印出大于 9 的值的字母等效项 结果是这样的 A 10 B 11 等等 PHP net 甚至没有该功能 或者我没有在正确的位置查找 但我确信它说的是功能
  • 限制每日访问

    我想在我的网站中实现一项限制对特定页面的访问的功能 每个 IP 每天应允许 2 次访问 我正在考虑创建一个 mysql 表并写入 ip ip 访问该网站的时间 然后创建一个 cron 作业 每 24 小时删除所有条目 但我担心他可能会导致服
  • 标头中的枚举会导致过多的重新编译

    约翰 拉科斯 John Lakos 将这个问题称为一个阴险的来源 编译时耦合 图0 3 在他的简介中 我面临的问题是编译了太多文件 因为对单个枚举存在物理依赖性 我有一个带有枚举定义的标题 version h enum Version v1
  • 找到重复的类 com.google.android.gms.location.places.zza

    这些是我在清单文件中的依赖项 implementation fileTree dir libs include jar implementation com android support appcompat v7 28 0 0 imple
  • SimpleXML:选择具有特定属性值的元素

    在 XML 文档中 我有共享相同名称的元素 但属性的值定义了它的数据类型 并且我想从文档中选择所有具有特定值的元素 我是否需要使用 XPath 如果需要 您能否建议正确的语法 或者是否有更优雅的解决方案 下面是一些 XML 示例
  • 如何从父解析器获取 argparse 子解析器(以检查默认值)

    假设我创建一个具有参数默认值的解析器 然后为其提供一个具有进一步参数默认值的子解析器 In 1 parser argparse ArgumentParser description test In 2 parser add argument