如何在“--help”中定义单击子命令的顺序

2024-01-10

我有这样的代码:

import click

@click.group()
def entry_point():
    pass

entry_point.add_command(lidtk.data.download_documents.main)
entry_point.add_command(lidtk.data.create_ml_dataset.main)
entry_point.add_command(lidtk.classifiers.text_cat.textcat_ngram.cli)

它给出了帮助文本:

lidtk --help
Usage: lidtk [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  create-dataset  Create sharable dataset from downloaded...
  download        Download 1000 documents of each language.
  textcat

这是over all非常接近我想要的。但我想将顺序更改为:

Commands:
  download        Download 1000 documents of each language.
  create-dataset  Create sharable dataset from downloaded...
  textcat

如何使用 click 来完成此操作?


帮助中列出的命令的顺序由list_commands()的方法click.Group班级。因此,满足更改帮助列表顺序的愿望的一种方法是继承click.Group并覆盖list_commands给出所需的订单。

定制类

这个类重写了click.Group.command()用于装饰命令函数的方法。它增加了指定一个的能力help_priority,它允许根据需要修改排序顺序:

class SpecialHelpOrder(click.Group):

    def __init__(self, *args, **kwargs):
        self.help_priorities = {}
        super(SpecialHelpOrder, self).__init__(*args, **kwargs)

    def get_help(self, ctx):
        self.list_commands = self.list_commands_for_help
        return super(SpecialHelpOrder, self).get_help(ctx)

    def list_commands_for_help(self, ctx):
        """reorder the list of commands when listing the help"""
        commands = super(SpecialHelpOrder, self).list_commands(ctx)
        return (c[1] for c in sorted(
            (self.help_priorities.get(command, 1), command)
            for command in commands))

    def command(self, *args, **kwargs):
        """Behaves the same as `click.Group.command()` except capture
        a priority for listing command names in help.
        """
        help_priority = kwargs.pop('help_priority', 1)
        help_priorities = self.help_priorities

        def decorator(f):
            cmd = super(SpecialHelpOrder, self).command(*args, **kwargs)(f)
            help_priorities[cmd.name] = help_priority
            return cmd

        return decorator

使用自定义类

通过通过cls参数到click.group()装饰器,通过添加到组的任何命令group.command()可以通过一个help_priority。优先级默认为 1,首先打印较小的数字。

@click.group(cls=SpecialHelpOrder)
def cli():
    """My Excellent CLI"""

@cli.command(help_priority=5)
def my_command():
    ....

这是如何运作的?

这是可行的,因为 click 是一个设计良好的 OO 框架。这@click.group()装饰器通常会实例化一个click.Group对象,但允许此行为被覆盖cls范围。所以继承是一件比较容易的事情click.Group在我们自己的类中并重写所需的方法。

步骤在这里:

  1. 覆盖Group.command()这样修饰后的命令就可以传递help_priority。在过度使用的装饰器中,捕获所需的优先级以供以后使用
  2. 覆盖Group.get_help()。在重写的方法中,替换Group.list_commands with a list_commands这将根据需要对命令进行排序。

测试代码:

import click

@click.group(cls=SpecialHelpOrder)
def cli():
    pass

@cli.command()
def command1():
    '''Command #1'''

@cli.command(help_priority=5)
def command2():
    '''Command #2'''

@cli.command()
def command3():
    '''Command #3'''

if __name__ == '__main__':
    cli('--help'.split())

检测结果:

Usage: test.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

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

如何在“--help”中定义单击子命令的顺序 的相关文章

  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 新的 Facebook SDK 应用程序不可用:您尝试使用的应用程序不再可用或访问受到限制

    新用户无法通过 Facebook 登录 并收到一条错误消息 应用程序不可用 您尝试使用的应用程序不再可用或访问受到限制 用户使用现有的 Facebook 帐户进行访问没有任何问题 当我在 Facebook 上创建虚假 测试帐户时 我遇到了这
  • 如何从文件名获取完整文件路径?

    如何获取给定文件的完整路径 例如我提供 string filename test txt 结果应该是 Full File Path C Windows ABC Test test txt Try string fileName test t
  • 应用程序范围的全局变量

    In Rails 我应该在哪里定义Rails堆栈的每一层都可以识别的变量 例如 我想要一个CUSTOMER NAME John 可以访问的变量helper rake task 控制器 and model 我应该在哪里定义这个变量Rails
  • jQuery 当前位置和滚动位置之间的差异

    我试图获取元素距顶部的当前距离与其滚动后的下一个位置之间的差异 事实上 我试图根据其距离来选择动画持续时间 我写了下面的代码 但它不能正常工作 I have 6菜单项 当我单击每个菜单项时 窗口滚动到其位置 但问题是 当我单击最后一项时 它
  • 从控制台运行 Zend Framework 2 操作不起作用

    我有一个 ZF2 应用程序从 Web 服务器正常运行 我需要从命令行运行一些操作 因为我想要执行一些计划任务 cron 作业 所以我找到了这些有用的链接 Zend框架的官方文档 http framework zend com manual
  • 将 vuex 状态与服务器同步的推荐策略

    想象一下这个简单的例子 您有一个 Vue JS 应用程序 用户可以在其中创建任务列表并对它们进行排序 这些列表应由服务器存储在数据库中 假设我们有一个ListComponent它完成了大部分用户体验 我的问题是 我应该使用哪种模式来处理前后
  • 最佳开源 LINQ 提供商 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何更改 C++ STL 向量的特定元素

    vector
  • 表达式等于

    所以 我正在尝试找出表达式树 我试图添加动态等于可查询 其中 T 是几个不同的表之一 我首先检查表中是否包含我想要过滤的字段 ParameterExpression param Expression Parameter typeof TSo
  • COM 中的内存管理

    在COM服务器执行期间分配一块内存 然后通过输出参数将该内存块传递给客户端是很常见的 然后 客户端有义务使用 CoTaskMemFree 等方法释放该内存 问题是 这块内存分配在哪里 假设COM服务器和COM客户端处于不同的进程中 为了让客
  • TypeScript 中 jQuery 对象的类型是什么?

    我应该为 jQuery 元素使用什么类型 没有 jQuery 我会这样继续 export class Modal constructor protected element HTMLElement 但是 可以说element将是一个 jQu
  • 当包含 Spring 数据剩余时,Spring 以纯 JSON 而非 HAL 格式返回资源

    当我为我的实体使用 Spring Data Rest 提供的默认控制器时 一切都会正常工作 输出如下所示 links search href http localhost 8080 users search embedded users f
  • iOS 10 上强制使用软件键盘

    当蓝牙 HID 设备 如条形码扫描仪 处于活动状态时 有没有人知道如何强制 iOS 中的屏幕软件键盘 关于 SO 有一些古老的问题 但大多数都是通过手动调整键盘视图的框架来解决的 并且从 iOS 8 开始 该方法似乎不再适用 奇怪的是 似乎
  • 根据 div 的高度动态更改其上边距

    我有一个固定在网页一侧的 div 我需要该 div 垂直居中 使用 CSS 轻松完成 注意 div 的基础高度为 300px sidePanel margin 150px 0 0 0 top 50 position fixed 我遇到的问题
  • MySQL 在 Group By 查询中选择错误的列值

    这是我遇到的一个真正的菜鸟 MySQL 查询问题 我正在编写的游戏中有一个高分表 高分DB记录姓名 等级以及获得的分数 数据库中有许多接近重复的内容 例如 Name Level Score Timestamp key Bob 2 41 12
  • Visual Studio 2017 15.3.0 git 更改包括“storage.ide”,即使 .gitignore 中的 .vs/

    几天前我将VS 2017升级到15 3 0 从那时起 文件 storage ide 一直保留在我修改的文件中 即使我使用过VS 的建议 gitignore https github com github gitignore blob mas
  • 运算符“<”不能应用于“object”和“int”类型的操作数

    我正在 ASP NET 和 C 中创建用户登录 但是在编写函数后 由于错误而无法编译 错误指出 运算符 我想检查 ExecuteNonQuery 的返回值是否大于 0 否则登录会失败 该存储过程是在类的前面与已确认的数据库连接字符串一起创建
  • 展开角度以获得连续相位

    假设我有一系列与此类似的阶段 import numpy as np import matplotlib pyplot as plt phase np linspace 0 100 1000 np pi plt plot phase plt
  • Lisp 反转“全部”函数

    我想在 lisp 中编写一个函数 使用映射函数反转列表中的所有元素 但我不知道如何开始这个 我想我必须以某种方式使用内置的反向函数 例如 如果我有列表 1 2 3 4 5 6 7 8 9 我会得到 9 8 7 6 5 4 3 2 1 或者如
  • 如何在“--help”中定义单击子命令的顺序

    我有这样的代码 import click click group def entry point pass entry point add command lidtk data download documents main entry p