Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python argparse帮助,无重复的ALLCAPS_Python_Argparse - Fatal编程技术网

Python argparse帮助,无重复的ALLCAPS

Python argparse帮助,无重复的ALLCAPS,python,argparse,Python,Argparse,我希望为我的选项显示argparse帮助,显示方式与默认的-h、-help和-v、-version相同,选项后没有ALLCAPS文本,或者至少没有重复的大写字母 import argparse p = argparse.ArgumentParser("a foo bar dustup") p.add_argument('-i', '--ini', help="use alternate ini file") print '\n', p.parse_args() 这就是我目前使用python f

我希望为我的选项显示argparse帮助,显示方式与默认的
-h
-help
-v
-version
相同,选项后没有ALLCAPS文本,或者至少没有重复的大写字母

import argparse
p = argparse.ArgumentParser("a foo bar dustup")
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()
这就是我目前使用
python foobar.py-h所得到的:

usage: a foo bar dustup [-h] [-i INI]

optional arguments:
  -h, --help            show this help message and exit
  -i INI, --ini INI     use alternate ini
这就是我想要的:

usage: a foo bar dustup [-h] [-i INI]

optional arguments:
  -h, --help            show this help message and exit
  -i, --ini INI         use alternate ini
这也是可以接受的:

  -i, --ini             use alternate ini

我使用的是python 2.7。

我可以告诉您有两种选择

import argparse

p = argparse.ArgumentParser(description="a foo bar dustup")
p.add_argument('-i', '--ini', metavar='', help="use alternate ini file")

print '\n', p.parse_args()
或者你可以写一个自定义,我意识到第一个选项可能不是一个完美的解决方案,因为它去掉了使用行中的大写字母。如果这里的argparse有那么重要的话,那么我可以告诉您,默认的格式化程序类并不能完全满足您的需要

编辑:

好吧,我继续为你建立了你自己的格式化程序类,和其他人一样。。。我不确定是否建议您在生产代码中使用它,因为没有任何关于它=P的官方python文档

import argparse
from argparse import HelpFormatter

class MyFormatter(HelpFormatter):
    """
        for matt wilkie on SO
    """

    def _format_action_invocation(self, action):
        if not action.option_strings:
            default = self._get_default_metavar_for_positional(action)
            metavar, = self._metavar_formatter(action, default)(1)
            return metavar

        else:
            parts = []

            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            else:
                default = self._get_default_metavar_for_optional(action)
                args_string = self._format_args(action, default)
                for option_string in action.option_strings:
                    parts.append(option_string)

                return '%s %s' % (', '.join(parts), args_string)

            return ', '.join(parts)

    def _get_default_metavar_for_optional(self, action):
        return action.dest.upper()

p = argparse.ArgumentParser("a foo bar dustup", formatter_class=MyFormatter)
p.add_argument('-i', '--ini', help="use alternate ini file")
p.print_help()

您可以自定义
用法
,并将
metavar
分配给空字符串:

import argparse

p = argparse.ArgumentParser("a foo bar dustup", usage='%(prog)s [-h] [-i INI]')
p.add_argument('-i', '--ini', help="use alternate ini file", metavar='')
p.print_help()
输出 用法:一个foo-bar dustup[-h][i INI] 可选参数: -h、 --帮助显示此帮助消息并退出 -i,--ini使用备用ini文件
+1您的解决方案解决了我的答案中存在的使用问题。我已接受此解决方案作为我当前项目的可行解决方案。根据MacGuy对Q的观察,去除大写字母可能不适合在任何地方使用,因为它违反了惯例,并且不清楚选项是否需要后续字符串(例如,
--download only
已完成,而
--ini
可能需要后续路径或文件名).如果我有一大堆论点呢。编写一个手动使用语句,说明我拥有的所有可选参数,这将使处理和编写变得更加困难。另外,在将来,如果一些参数被删除,一些被添加到新的参数中,那么我认为自动生成将比手动处理usage语句更好。那么,除了在用法声明中使用元字符而不是在解释它的部分之外,还有什么其他方法可以解决这个问题呢。@RakholiyaJenish:你可以问一个适当的单独的StackOverflow问题:在当前的问题上加上解释它到底有多不同——就像你在评论中所做的那样。谢谢@J.F.Sebastian,我问了一个问题,但没有得到任何评论或答案。请你看看好吗。我不同意这个问题的前提。命令行参数通常从shell传递,按照惯例,shell脚本中的变量通常都是大写的。我认为区分大写的metavars和小写的关键字是恰当的。@TokenMacGuy根据这种惯例,我会同意的,除了不必要地重复大写(
-INI,--INI-INI
)。我已经相应地更新了Q标题,因为它的重复性更令人烦恼。@MacGuy作为一个用户,您应该可以灵活地使用任何您认为合适的帮助消息。我个人觉得CAPS版本很难看,更不用说复制了。即使您打破了shell约定,也可以区分metavars,例如,
git commit-h
+1,以获得最佳答案和到源代码的链接。您是否需要为可选的
方法覆盖
\u get\u default\u metavar\u?在链接到它的源中,使用了相同的方法。您这样做是为了确保即使HelpFormatter以后实现了其他功能,也能使用大写字母吗?为了清晰起见,我在阅读可选的方法名时,没有对我发出尖叫声,而是加入了该方法。我猜,
\u format\u args
可能会进行一些字符串格式设置。如何为可选的
获取默认值\u metavar\u而不是尖叫
str.upper
?当然,只是开玩笑;你说得很对。 usage: a foo bar dustup [-h] [-i INI] optional arguments: -h, --help show this help message and exit -i , --ini use alternate ini file