【问题标题】:Fully customized Python Help Usage完全自定义的 Python 帮助用法
【发布时间】:2018-04-17 12:05:08
【问题描述】:

我正在尝试使用 Python 创建一个完全自定义的“帮助”用法(我计划将其导入到许多我希望具有样式一致性的程序中),但遇到了一些麻烦。

  1. 我不知道为什么我的描述忽略了换行符... 试过""和'',
  2. 我无法让“:”出现在“...ARGS”行的 /newline 之后,显然它们坐在自己的行上看起来很奇怪,并且
  3. 我不知道如何在末尾添加换行符。请帮忙??

这是我现在得到的示例:

nameconstant version 1.0

USAGE:  myprog.py [constant text] <input.ext> <input.ext>

several lines of text describing my program.. because it will be necessary

___________________
COMPULSORY ARGS:
  input.ext
  output.ext

___________________
OPTIONAL ARGS:
  -v, --verbose  print debugging messages to terminal
  -h, --help

这就是我想要的样子:

nameconstant version 1.0

USAGE:  myprog.py [constant text] <input.ext> <input.ext>

several lines of text
describing my program..

because it will be necessary

___________________
COMPULSORY ARGS:

  input.ext
  output.ext

___________________
OPTIONAL ARGS:

  -v, --verbose      print debugging messages to terminal
  -h, --help
\n - not visible!

这是我目前工作的代码:

#!/usr/bin/env python
import argparse
import sys 
from os import path
version = "1.0"

prog = path.basename(sys.argv[0])

class USAGEformat(argparse.HelpFormatter):
        def add_usage(self, usage, actions, groups, prefix=None):
                if prefix is None:
                        prefix = 'nameconstant version '+ version+'\n\nUSAGE:  '+prog
                return super(USAGEformat, self).add_usage(
                      usage, actions, groups, prefix)

parser = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat, description='several lines of text\ndescribing my program..\n\nb
ecause it will be necessary', usage=' [optional args] <INPUT.ext> <OUTPUT.ext>')

parser._positionals.title = '___________________\nCOMPULSORY ARGS'
parser._optionals.title = '___________________\nOPTIONAL ARGS'

parser.add_argument('input', metavar="input.ext", type=argparse.FileType('rt'))
parser.add_argument('output', metavar="output.ext", type=argparse.FileType('wt'))
parser.add_argument('-v', '--verbose', action='store_true', default=False, help='print debugging messages to terminal')
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS)

接下来我应该做些什么不同的事情或研究什么?谢谢!非常感谢任何帮助。我是 Python 新手。

【问题讨论】:

  • 要保留换行符,您需要使用(子类)RAW... helpformatter 类之一,而不是它们的父类HelpFormatter。当你在看它时,看看它们是如何修改父级的。变化不大。
  • USAGE 行的约定是在方括号中包含可选参数。所以我不认为你真的想要 [input.ext] 和 [output.ext] 在第一行并将它们放在 COMPULSORY 部分。
  • @xhancar 谢谢你,我想这件事做错了有一段时间了,完全忽略了它,因为我觉得它看起来不错哈哈。赞赏!将检查是否在我所有现有代码中切换 和 []。

标签: python customization argparse


【解决方案1】:
import argparse
version = "1.0"

class USAGEformat(argparse.RawDescriptionHelpFormatter):
    def add_usage(self, usage, actions, groups, prefix=None):
        if prefix is None:
            prefix = 'nameconstant version '+ version+' USAGE:  '
            return super(USAGEformat, self).add_usage(
                usage, actions, groups, prefix)

parser = argparse.ArgumentParser(add_help=False, formatter_class=USAGEformat,
   description=\
'''several lines of text
describing my program..

because it will be necessary''')

gp1 = parser.add_argument_group('___________________\nCOMPULSORY ARGS')
gp1.add_argument('input', metavar="input.ext", type=argparse.FileType('rt'))
gp1.add_argument('output', metavar="output.ext", type=argparse.FileType('wt'))

gp2 = parser.add_argument_group('___________________\nOPTIONAL ARGS')
gp2.add_argument('-v', '--verbose', action='store_true', default=False,
      help='print debugging messages to terminal')
gp2.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS)

parser.print_help()

生产

2156:~/mypy$ python stack47118098.py 
nameconstant version 1.0 USAGE:  stack47118098.py [-v] [-h]
                                                  input.ext output.ext

several lines of text
describing my program..

because it will be necessary

___________________
COMPULSORY ARGS:
  input.ext
  output.ext

___________________
OPTIONAL ARGS:
  -v, --verbose  print debugging messages to terminal
  -h, --help

RawDescriptionHelpFormatter 保留描述的格式。

我使用'''...''' 进行描述只是为了让代码看起来更漂亮;这不重要。

我用argument_groups 替换了您对现有组的重命名。你的方式很好,但我认为我的方式是开发人员想要的。

HelpFormatter 格式化各个部分,在它们之间大量使用\n,然后最终去除重复项(包括结尾)。所以我们必须识别和修改相关方法(format_help)。

自从我开始回答以来,您对 usage 行进行了一些更改。

我同意按照惯例显示所需参数的注释,不带[]

我得到这个用法是因为带有前缀的行太长了。所以它拆分它,并将位置放在第二行,与可选项对齐:

nameconstant version 1.0 USAGE:  stack47118098.py [-v] [-h]
                                                  input.ext output.ext

如果我设置

prefix = 'USAGE:  '

那么用法是

USAGE:  stack47118098.py [-v] [-h] input.ext output.ext

我们必须看看它是如何进行包装和缩进的,以使使用符合您的规范。

编辑

importing custom python modules.. why do only some elements carry over?

我解释说,每次您请求帮助或使用时,都会重新创建帮助格式化程序。定义parser 设置格式化程序类,但不创建格式化程序。这意味着格式化程序类使用的任何全局变量都将在运行时而不是设置时获取它们的值。

例如,version 是全局的(对模块而言)。它最初是“1.0”,这是出现在用法中的值。但是如果我添加到上述脚本的末尾:

version = '2.0'
parser.print_help()

用法行更改为:

nameconstant version 2.0 USAGE:  stack47118098.py [-v] [-h]
                                                  input.ext output.ext

如果我使用以下命令导入此脚本:

import stack47118098 as pp

print('===========')
print(pp.version)
print(pp.parser)
pp.parser.print_help()

pp.version = '3.0'
pp.parser.print_help()

第一个帮助(导入后)使用文件中的“2.0”版本。但是第二个帮助使用了新定义的version

要更改解析器的 description 之类的东西,我必须使用

pp.parser.description = 'New short description'

也就是说,我正在修改现有对象的一个​​属性。

【讨论】:

  • 太棒了,谢谢!!顺便说一句,对开发人员意图的替代语法和评论表示赞赏。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2011-09-06
  • 2018-07-02
相关资源
最近更新 更多