(半)自动生成函数的 argparsers

2023-11-27

tldnr:给定一个函数,有没有办法根据其签名自动创建 ArgumentParser?

我有很多想要向命令行公开的函数。基本上,一个模块:

 def copy(foo, bar, baz):
    ...
 def move(from, to):
    ...
 def unlink(parrot, nomore=True):
    ...

 if __name__ == '__main__':
     argparse stuff

可以像这样从命令行调用:

 python commands.py move spam ham
 python commands.py unlink --parrot Polly

尽管实现起来非常简单,但涉及很多接线:

parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()
...
c = subparsers.add_parser('unlink', description='Unlink a parrot')
c.add_argument('--parrot', help='parrots name', required=True)
c.add_argument('--nomore', help='this parrot is no more', action='store_true')
...
c = subparsers.add_parser('move', description='Move stuff')
...

对于每个函数,依此类推。最糟糕的是,如果函数参数发生变化(确实如此),则需要手动同步 argparse 内容。

如果函数可以为自己提供 argparse 的东西,那就更好了,这样主代码就会像这样:

parser = argparse.ArgumentParser(...)
subparsers = parser.add_subparsers()

copy.register(subparsers)
move.register(subparsers)
unlink.register(subparsers)
...

我想到了一些类似的事情:

@args(
    description='Unlink a parrot',
    parrot={'required':True, 'help':'parrots name'},
    nomore={'action': 'store_true', 'help': 'this parrot is no more'}
)
def unlink(parrot, nomore=True):
    ...

我的问题:

  • 有没有一个图书馆可以做这样的事情?
  • 如果没有,是否可以编写这样的装饰器,以及如何编写?
  • 有其他/更好的方法来实现我想要的吗?

Upd:

plac似乎是解决方案。以下是如何用 plac 做我想做的事情:

命令模块:cmds.py:

import plac

@plac.annotations(
    foo=('the foo thing'),
    bar=('the bar thing'),
    fast=('do a fast copy', 'flag')
)
def copy(foo, bar, fast=False):
    """Copy some foo to bar."""
    pass
        
@plac.annotations(
    parrots=('parrots names'),
    nomore=('these parrots are no more', 'flag'),
    repeat=('repeat n times', 'option', 'r', int)
)
def unlink(nomore=False, repeat=1, *parrots):
    """Unlink some parrots."""
    pass

#more commands...

# export commands so that plac knows about them
commands = 'copy', 'unlink'

这是主模块:

import plac
import cmds

plac.call(cmds)

如果你问我的话,相当整洁。


我发现的“最少样板”库是fire (pip install fire).

为您的示例创建命令行解析器非常简单:

import fire

def copy(foo, bar, baz):
...
def unlink(parrot, nomore=True):
...

if __name__ == '__main__':
    fire.Fire()

这会将您的模块变成“Fire”CLI:

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

(半)自动生成函数的 argparsers 的相关文章

  • 使用Python开发Web应用程序

    我一直在用 python 做一些工作 但这都是针对独立应用程序的 我很想知道 python 的任何分支是否支持 Web 开发 有人还会建议一个好的教程或网站吗 我可以从中学习一些使用 python 进行 Web 开发的基础知识 既然大家都说
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • 在将用户输入的 PHP 代码传递给 eval() 之前验证它

    在将字符串传递给 eval 之前 我想确保语法正确并允许 两个函数 a 和 b 四个运算符 括号 数字 1 2 1 1 我该如何做到这一点 也许它与 PHP Tokenizer 有关 我实际上正在尝试制作一个简单的公式解释器 因此 a 和
  • 瓦提尔。滚动到页面的某一点

    我正在尝试在网站上自动进行在线调查 但每次都会收到此错误 Selenium WebDriver Error UnknownError unknown error Element is not clickable at point 561 8
  • 如何使用maven部署带有依赖jar的Applet并对其进行签名?

    有人可以告诉我 pom 文件应该是什么样子来创建一个带有小程序的 jar 文件 该文件依赖于其他一些 jar 是否可以将一个 jar 作为小程序 以及如何对其进行签名 如果你想要你的课程and出现在的依赖项一个 jar 文件 你应该使用组装
  • Chrome 开发工具设置中没有“覆盖”页面

    如何在我的设置中启用覆盖面板 我打开 Chrome 浏览器 它就消失了 我浪费了大部分时间试图让它工作 但谷歌上有 0 个答案 谢谢 Chrome 让我的设置消失 酷 仿真 面板是新的 覆盖 面板
  • Gmail 上下文小工具

    我想问题一是 现在是否真的可以为 gmail 创建一个上下文小工具 在过去的两天里 我仔细阅读了 非常过时的 文档 以及我能找到的关于该主题的每个论坛帖子 我已经尝试了所有方法 但什么也没看到 甚至没有任何可能为我指明正确方向的错误消息提示
  • 绑定变量和替换变量(我使用 && 输入)之间有什么区别?

    这两个变量声明有什么区别 1 num number num 2 variable num1 number 因为在这两种情况下我都可以参考num通过使用 num or num在其他文件中也 对于绑定变量 num1 此外 我还有一个困惑 以下任
  • C# 数组从一行中拆分获取最后一项

    我知道这可以获取数组的第一项 string aString hello all this is a test string firstItemOfSplit aString Split new char 0 firstItemOfSplit
  • 如何使用 JPA 设置 Eclipselink?

    The Eclipselink 文档说我需要在 pom xml 中包含以下条目才能使用 Maven 获取它
  • 将带有多个分隔符的文本导入 pandas

    我有一些数据看起来像这样 c stuff c more header c begin data 1 1 5 1 2 6 5 1 3 5 3 我想将其导入到 3 列数据框中 其中列例如 a b c 1 1 0 5 etc 我一直在尝试将数据读
  • 私有函数 didFinishLaunchingWithOptions 没有被调用? (斯威夫特 3)

    Isn t didFinishLaunchingWithOptions应该在应用程序第一次开始运行时调用 我在此方法中设置了一个断点 当我在模拟器中运行应用程序时 断点不会被命中 这意味着该方法不会被调用 每当应用程序启动时 我都会尝试从
  • 在 MongoDB 中缓存重复查询结果

    我将构建一个旨在被大量 查看 的页面 但很少有用户会 写入 数据库 例如 只有百分之一的用户可能会在我的网站上发布他的新闻 其余的只会阅读新闻 在上面的例子中 当他们访问我的主页时会执行100个SAME QUERIES 而实际的数据库变化很
  • 有什么方法可以区分主线程和它生成的任何线程吗?

    我知道getName 主线程上的函数将返回字符串main 但这可以改变setName 有没有办法始终确定应用程序的主线程 一种可能性是致电Thread currentThread 开始时main 并保留参考
  • 为什么需要将项目合规性更改为 1.5?

    我在eclipse上用maven2创建了一个项目 添加 hibernate annotations 依赖项后 我尝试使用 hibernate 注释 Entity Table 创建一个类 但它给了我这个错误 将项目合规性和 JRE 更改为 1
  • Java 替换文本文件中的行

    我从另一个问题中找到了这段代码 private void updateLine String toUpdate String updated throws IOException BufferedReader file new Buffer
  • 基于Mysql json的趋势标签实现

    我正在尝试使用 mysql json 功能来识别时间序列上的趋势标签 基于最大点击量 下面是我的桌子 CREATE TABLE TAG COUNTER account varchar 36 NOT NULL time id INT NOT
  • 9 块图像作为背景的问题

    我有一个列表视图结构 具有使用的相对布局 奇数 偶数元素交替背景图像 我正在尝试设置 通过计算位置动态绘制背景 它 与普通位图一起工作得很好 但是当我尝试使用 ninepatch 图像它破坏了用户界面 所有元素都扭曲了 什么 我做错了吗 这
  • 帮助了解像素化算法背后的理论吗?

    假设我有一张想要 像素化 的图像 我想要这个由 100 x 100 方格网格表示的清晰图像 因此 如果原始照片为 500 px X 500 px 则每个正方形为 5 px X 5 px 因此 每个正方形都有一个与它交换的 5 px X 5
  • Angular ReactiveForms:生成复选框值数组?

    给定绑定到相同复选框的列表formControlName 如何生成绑定到的复选框值数组formControl 而不是简单地true false Example
  • TinyMCE 处于只读模式时启用按钮

    我有一个 TinyMCE 4 x 实例 其中文本应处于只读模式 但我仍然有一些想要启用的按钮 例如 一个按钮可以提供我选择的文本部分的字符计数 但是当我打开 TinyMCE 的只读模式时 所有按钮都被禁用 我可以只启用我的按钮 同时仍保留只
  • (半)自动生成函数的 argparsers

    tldnr 给定一个函数 有没有办法根据其签名自动创建 ArgumentParser 我有很多想要向命令行公开的函数 基本上 一个模块 def copy foo bar baz def move from to def unlink par