Python 的 argh 库:在帮助消息中保留文档字符串格式

2024-03-26

在寻找更快的方法来解析脚本中的命令行参数时,我遇到了啊图书馆 https://pypi.python.org/pypi/argh.

我真的很喜欢 argh 的功能,但我遇到了一个阻止我使用它的缺点,这与我调用 —help 选项时显示的默认帮助消息有关: 默认情况下,函数的文档字符串显示在参数列表的顶部。这很棒,但是初始格式会丢失。例如,请参阅以下示例脚本

import argh

def func(foo=1, bar=True):
    """Sample function.

        Parameters:
            foo: float
                An example argument.
            bar: bool
                Another argument.
    """
    print foo, bar

argh.dispatch_command(func, argv=['-h'])

这将导致以下输出

usage: script.py [-h] [-f FOO] [-b]

Sample function. Parameters: foo: float An example argument. bar: bool Another
argument.

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO
  -b, --bar

有没有一种(简单)方法可以获得如下输出?

usage: script.py [-h] [-f FOO] [-b]

Sample function.

    Parameters:
        foo: float
            An example argument.
        bar: bool
            Another argument.

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO
  -b, --bar

我不想使用注释来定义参数帮助消息,因为这需要我在每次需要更改时更改函数的文档字符串和帮助文本。


我不熟悉argh,但显然它是一个包装器argparse。我的猜测是它正在占用你的功能__doc__,并使其成为description解析器的,例如

parser = argparse.ArgumentParser(description=func.__doc__)

https://docs.python.org/2.7/library/argparse.html#argparse.RawDescriptionHelpFormatter https://docs.python.org/2.7/library/argparse.html#argparse.RawDescriptionHelpFormatter

argparse has a RawDescriptionHelpFormatter按原样显示描述。

parser = argparse.ArgumentParser(description=func.__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter)

那么问题来了,有没有办法得到argh使用这个格式化程序?

This argparse脚本生成您想要的帮助:

import argparse

def func(foo=1, bar=True):
    """Sample function.

        Parameters:
            foo: float
                An example argument.
            bar: bool
                Another argument.
    """
    print foo, bar

parser = argparse.ArgumentParser(prog='script.py',
    description=func.__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('-f', '--foo', type=float)
parser.add_argument('-b', '--bar', action='store_false')
parser.print_help()

In argh/dispatching.py

def dispatch_command(function, *args, **kwargs):
    ...
    parser = argparse.ArgumentParser(formatter_class=PARSER_FORMATTER)
    set_default_command(parser, function)
    dispatch(parser, *args, **kwargs)

所以你可以设置:

PARSER_FORMATTER = argparse.RawDescriptionHelpFormatter

或者编写您自己的函数:

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

Python 的 argh 库:在帮助消息中保留文档字符串格式 的相关文章

随机推荐