Python单击:自定义错误消息

我使用优秀的Python Click库来处理我的工具中的命令行选项。 这是我的代码的简化版本(完整脚本在这里):

@click.command(
    context_settings = dict( help_option_names = ['-h', '--help'] )
)
@click.argument('analysis_dir',
                 type = click.Path(exists=True),
                 nargs = -1,
                 required = True,
                 metavar = "<analysis directory>"
)

def mytool(analysis_dir):
   """ Do stuff """

if __name__ == "__main__":
    mytool()

如果有人在没有任何标志的情况下运行该命令,则会得到默认的单击错误消息

$ mytool

Usage: mytool [OPTIONS] <analysis directory>

Error: Missing argument "analysis_dir".

这很好,但我很想告诉(非常)新手用户,通过使用帮助标志可以获得更多帮助。 换句话说,当命令无效时,向错误消息添加自定义句子,告诉用户尝试使用mytool --help以获取更多信息。

是否有捷径可寻? 我知道我可以删除required属性,并在主函数中处理这个逻辑,但是对于这样一个小小的添加,这感觉很有趣。


用于python单击的大多数错误的消息构造由UsageError类的show方法处理: click.exceptions.UsageError.show

因此,如果您重新定义此方法,您将能够创建自己的自定义错误消息。 下面是一个自定义的例子,它将帮助菜单附加到任何错误消息中,以回答这个问题:

def modify_usage_error(main_command):
    '''
        a method to append the help menu to an usage error

    :param main_command: top-level group or command object constructed by click wrapper 
    :return: None
    '''

    from click._compat import get_text_stderr
    from click.utils import echo
    def show(self, file=None):
        import sys
        if file is None:
            file = get_text_stderr()
        color = None
        if self.ctx is not None:
            color = self.ctx.color
            echo(self.ctx.get_usage() + 'n', file=file, color=color)
        echo('Error: %sn' % self.format_message(), file=file, color=color)
        sys.argv = [sys.argv[0]]
        main_command()

    click.exceptions.UsageError.show = show

一旦你定义了主命令,你就可以运行修饰符脚本:

import click
@click.group()
def cli():
    pass

modify_usage_error(cli)

我还没有探究是否有使用错误以外的ClickException的运行时调用。 如果存在,那么您可能需要修改自定义错误处理程序,以便在添加行之前首先检查ctx是否为属性click.exceptions.ClickException.show = show因为它没有出现ClickException在初始化时被提供ctx。

链接地址: http://www.djcxy.com/p/36303.html

上一篇: Python Click: custom error message

下一篇: EF Eager fetching derived class