在 argparse 中使用变量 arg 名称

2023-12-22

我有一个上游系统,它使用不同的参数名称调用我的程序。例子:

foo --xyz1 10 --xyz2 25 --xyz3 31

我希望 argparsing 的结果为 xyz = [10, 25, 31]。

我的参数名称有一个共同的前缀,但不幸的是至少必须有不同的数字后缀,这也表示顺序。我也没有固定数量的参数。

有没有办法用 argparse 对此进行建模?要么通过内置功能的某种组合提供可用的功能,要么通过覆盖/插入某些自定义解析器处理来实现。


我建议进行一些预处理来实现此目的:

Code:

def get_xyz_cmd_line(xyz_cmd_line):
    # build a generator to iterate the cmd_line
    cmd_line_gen = iter(xyz_cmd_line)

    # we will separate the xyz's from everything else
    xyz = []
    remaining_cmd_line = []

    # go through the command line and extract the xyz's
    for opt in cmd_line_gen:
        if opt.startswith('--xyz'):
            # grab the opt and the arg for it
            xyz.append((opt, cmd_line_gen.next()))
        else:
            remaining_cmd_line.append(opt)

    # sort the xyz's and return all of them as -xyz # -xyz # ... 
    return list(it.chain(*[
        ('--xyz', x[1]) for x in sorted(xyz)])) + remaining_cmd_line 

To Test:

import argparse
import itertools as it

parser = argparse.ArgumentParser(description='Get my Option')
parser.add_argument('--an_opt', metavar='N', type=int,
                    help='An option')
parser.add_argument('--xyz', metavar='N', type=int, action='append',
                    help='An option')

cmd_line = "--an_opt 1 --xyz1 10 --xyz3 31 --xyz2 25 ".split()
args = parser.parse_args(get_xyz_cmd_line(cmd_line))
print(args)

Output:

Namespace(an_opt=1, xyz=[10, 25, 31])

To use:

名义上而不是固定的cmd_line如上面的示例所示,这将通过以下方式调用:

args = parser.parse_args(get_xyz_cmd_line(sys.argv[1:]))

更新:如果您需要 --xyz=31 (即=分隔器):

那么你需要改变:

# grab the opt and the arg for it
xyz.append((opt, cmd_line_gen.next()))

To:

if '=' in opt:
    xyz.append(tuple(opt.split('=', 1)))
else:
    # grab the opt and the arg for it
    xyz.append((opt, cmd_line_gen.next()))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 argparse 中使用变量 arg 名称 的相关文章

随机推荐

  • MariaDB JDBC 客户端日志记录

    有没有办法记录查询in java使用 MariaDB jdbc 驱动程序 对于 MySQL 驱动程序 我正在使用 profileSQL true logger com mysql jdbc log Slf4JLogger 在开发机器上记录查
  • 运行 iOS 8.3 的 iPhone 在 Xcode 6.2 中显示为不合格

    当前设置 iPhone 6 更新至 iOS 8 2 使用 Xcode 6 2 运行 Mavericks 10 9 的 iMac 部署目标设置为 8 2 当我连接 iPhone 时 它 显示为不合格 此外 它还显示此警告 我试过了 重新启动
  • 在多台计算机上使用 Android 模拟器映像

    我创建了 Android 的自定义版本 并将其作为模拟器映像在开发计算机上运行 我需要能够在另一台运行 Windows 的计算机上使用该映像 它是在 Mac 上构建的 我找到了模拟器使用的图像文件 ramdisk img userdata
  • 适合新手的排序算法

    所以 Net 和 Java 已经把我宠坏了 我不需要 被要求 学习任何排序算法 但现在我需要用不同的语言对数组进行排序 但没有这种奢侈 我能够毫无问题地学习冒泡排序 然而 一些消息来源讨厌使用冒泡排序 因为它在 n 2 比较的平均和最坏情况
  • 如何获取特定Python模块中的变量列表?

    假设我有以下文件结构 data py foo bar abc def core py import data do something here a print a foo bar abc 我需要获取 data py 文件中定义的所有变量
  • 从实体框架中检索没有 ONE 字段的对象

    我正在使用实体框架来连接数据库 我有一个小问题 我有一张表 其中有一个 varbinary MAX 列 带有文件流 我使用 SQL 请求来管理 数据 部分 但使用 EF 来管理其余部分 文件的元数据 我有一个代码必须获取文件的所有文件 id
  • 如何为任何 Android 设备安装 ADB 驱动程序?

    我是一名安卓开发者 我有一部新的 HTC Inspire 4g 手机 但我不知道如何为其安装 USB 驱动程序 这是我的 android winusb inf 文件 Android WinUsb driver installation Ve
  • Hadoop Pig:传递命令行参数

    有没有办法做到这一点 例如 传递要处理的文件的名称等 这出现在另一个问题 https stackoverflow com questions 3515481 pig latin load multiple files from a date
  • 如何使活动窗口始终位于顶部

    我想创建一个始终位于其他活动顶部的活动 如 Windows 中的模式窗口或任务管理器 我如何在 Android 上执行此操作 谢谢 您可以在 Activity 的重写 onStop 方法中使用以下代码 Override protected
  • 使用代码隐藏从 XAML 访问变量并从 ViewModel 访问对象

    我是 Windows Phone 开发的新手 我想问一下这个场景是否可以实现 我需要使用后面的代码访问 XAML 中的变量 然后将其作为项目添加到视图模型中找到的现有列表中 因此 我需要访问视图模型以获取列表 并访问 XAML 以从资源中获
  • GDAL 未链接

    我正在尝试让我的程序在 Windows 上运行 它依赖于GDAL 一个用于加载GIS数据的库 它在 Linux 和 macOS 上都能很好地编译和链接 我将 CMake 与 MinGW 一起使用 并且遇到了如下链接错误 undefined
  • Objective-C:向类别添加属性

    我已经为 NSDate 构建了一个类别 我想在这个类别中封装一个属性来保存一些数据 但我无法实现添加此属性 只能添加方法 有什么办法可以实现这一点吗 谢谢 这里有一些代码 文件名 NSObject dictionary h import
  • Android ScrollView 滚动条大小

    我正在使用 ScrollView 我想设置 ScrollBar 大小 但我尝试的一切都失败了 我尝试使用属性 android scrollbarSize 样式 主题 但什么也没有 滚动条的大小始终相同 有什么建议么 谢谢 我尝试过这个
  • 使用 Jackson 序列化 java 对象时维护子类型信息,而不使用包装类

    我正在尝试使用 Jackson 在 Java 中的 JSON 文件和具有两个子类的抽象类之间进行转换 理想情况下 我想使用如下 JSON 没有包装器的 Json 文档 type lion name Simba endangered true
  • 如何在实体框架查询中初始化空列表?

    我已将列表字段添加到我的业务模型中 它尚未存储在数据库中 我希望用如下所示的内容临时映射它 return MyContext Foos Select foo gt new Foo Id foo Id Name foo Name Requir
  • 从 PostgreSQL 中的时间戳获取日期

    我有一个 PostgreSQL 时间戳 2009 12 22 11 01 46 我需要将其更改为 2009 12 22 这样我就可以比较日期postgreSQL 我怎样才能实现这个转变 将其投射到date SELECT yourtimest
  • VB.NET 管理对象帮助

    我正在尝试创建一个函数来将映射的驱动器路径转换为 UNC 路径 我做了一些谷歌搜索并发现several http groups google nu group DotNetDevelopment msg 6caffd33ad1eae11 不
  • iis7上的gzip http压缩问题

    我的网络托管提供商正在运行 IIS7 但我在让 gzip 压缩正常工作方面遇到了很多麻烦 主机管理员说已安装压缩 我可以使用一些在线检查服务确认压缩 但不能使用其他服务 PageSpeed Firefox 插件还表示该网站未压缩 我个人坐在
  • 无法分配给函数调用是什么意思(python)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我最近开始学习Python 我被分配的任务是创建一个在字典中平均成绩的函数 lloyd name Lloyd homework 9
  • 在 argparse 中使用变量 arg 名称

    我有一个上游系统 它使用不同的参数名称调用我的程序 例子 foo xyz1 10 xyz2 25 xyz3 31 我希望 argparsing 的结果为 xyz 10 25 31 我的参数名称有一个共同的前缀 但不幸的是至少必须有不同的数字