我有这个代码,我通常很高兴:
import argparse
servers = [ "ApaServer", "BananServer", "GulServer", "SolServer", "RymdServer",
"SkeppServer", "HavsServer", "PiratServer", "SvartServer", "NattServer", "SovServer" ]
parser = argparse.ArgumentParser(description="A program to update components on servers.")
group = parser.add_mutually_exclusive_group()
group.add_argument('-l', '--list', dest="update", action='store_false', default=False, help='list server components')
group.add_argument('-u', '--updatepom', dest="update", action='store_true', help='update server components')
parser.add_argument('-o', '--only', nargs='*', choices=servers, help='Space separated list of case sensitive server names to process')
parser.add_argument('-s', '--skip', nargs='*', choices=servers, help='Space separated list of case sensitive server names to exclude from processing')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
我喜欢选择=服务器为我验证输入中的服务器名称,所以我不必这样做.但是,有这么多有效的选择会使帮助输出看起来很糟糕:
usage: args.py [-h] [-l | -u]
[-o [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]]]
[-s [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]]]
A program to update components on servers.
optional arguments:
-h, --help show this help message and exit
-l, --list list server components
-u, --updatepom update server components
-o [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]], --only [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]]
Space separated list of case sensitive server names to
process
-s [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]], --skip [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} [{ApaServer,BananServer,GulServer,SolServer,RymdServer,SkeppServer,HavsServer,PiratServer,SvartServer,NattServer,SovServer} ...]]
Space separated list of case sensitive server names to
exclude from processing
Run Code Online (Sandbox Code Playgroud)
如果我需要,你会推荐哪种方式:
servers.奖金:
附加
我尝试使用michaelfilms建议,-o -s从上面的输出中删除选项,并添加此部分:
server optional arguments:
Valid server names are: ApaServer, BananServer, GulServer, SolServer,
RymdServer, SkeppServer, HavsServer, PiratServer, SvartServer,
NattServer, SovServer
Run Code Online (Sandbox Code Playgroud)
我认为它看起来很不错,但我真的需要提供帮助-o和-s选项,否则用户不会知道它们.所以我还没有使用这种方法.
小智 47
我基本上重复了Ernest所说的 - 为了避免丑陋的长选择列表,为基于选择的参数设置metavar =''(尽管它不会消除参数和逗号之间的空白(例如-o ,代替-o,).然后,您可以在一般描述中详细描述可用选项(如果您希望它们列出明显的缩进,则RawDescriptionHelpFormatter在此处很有用).
我不明白为什么欧内斯特的答案被否决了.这段代码
import argparse
servers = [ "ApaServer", "BananServer", "GulServer", "SolServer", "RymdServer",
"SkeppServer", "HavsServer", "PiratServer", "SvartServer", "NattServer", "SovServer" ]
parser = argparse.ArgumentParser(description="A program to update components on servers.")
group = parser.add_mutually_exclusive_group()
group.add_argument('-l', '--list', dest="update", action='store_false', default=False, help='list server components')
group.add_argument('-u', '--updatepom', dest="update", action='store_true', help='update server components')
parser.add_argument('-o', '--only', choices=servers, help='Space separated list of case sensitive server names to process. Allowed values are '+', '.join(servers), metavar='')
parser.add_argument('-s', '--skip', choices=servers, help='Space separated list of case sensitive server names to exclude from processing. Allowed values are '+', '.join(servers), metavar='')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
产生以下帮助输出
usage: run.py [-h] [-l | -u] [-o] [-s]
A program to update components on servers.
optional arguments:
-h, --help show this help message and exit
-l, --list list server components
-u, --updatepom update server components
-o , --only Space separated list of case sensitive server names to
process. Allowed values are ApaServer, BananServer,
GulServer, SolServer, RymdServer, SkeppServer, HavsServer,
PiratServer, SvartServer, NattServer, SovServer
-s , --skip Space separated list of case sensitive server names to
exclude from processing. Allowed values are ApaServer,
BananServer, GulServer, SolServer, RymdServer, SkeppServer,
HavsServer, PiratServer, SvartServer, NattServer, SovServer
Run Code Online (Sandbox Code Playgroud)
希望原始帖子正在寻找.
Mik*_*ike 10
我有同样的问题,作为解决方法,我使用epilog来描述每个选项.我不得不使用argparse.RawTextHelpFormatter,它允许您指定epilog是预格式化的.
def choicesDescriptions():
return """
Choices supports the following:
choice1 - the FIRST option
choice2 - the SECOND option
...
choiceN - the Nth option
"""
def getChoices():
return ["choice1", "choice2", ..., "choiceN"]
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter, epilog=choicesDescriptions())
parser.add_argument(
'choices',
choices=getChoices(),
help='Arg choice. See the choices options below'
)
args = parser.parse_args()
print(args)
Run Code Online (Sandbox Code Playgroud)
在原始问题中选项列表非常长的情况下这无济于事,但对于像我这样的人来说,遇到这个问题寻找一种方法来将中等长度的选项字符串分成两行,这是我的解:
import argparse
class CustomFormatter(argparse.HelpFormatter):
"""Custom formatter for setting argparse formatter_class. Identical to the
default formatter, except that very long option strings are split into two
lines.
"""
def _format_action_invocation(self, action):
if not action.option_strings:
metavar, = self._metavar_formatter(action, action.dest)(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 = action.dest.upper()
args_string = self._format_args(action, default)
for option_string in action.option_strings:
parts.append('%s %s' % (option_string, args_string))
if sum(len(s) for s in parts) < self._width - (len(parts) - 1) * 2:
return ', '.join(parts)
else:
return ',\n '.join(parts)
Run Code Online (Sandbox Code Playgroud)
此代码将覆盖缺省的argparse.HelpFormatter方法_format_action_invocation,并且与最后四行中的默认实现相同.
默认格式化程序行为:
parser = argparse.ArgumentParser(description="Argparse default formatter.")
parser.add_argument('-a', '--argument', help='not too long')
parser.add_argument('-u', '--ugly', choices=range(20), help='looks messy')
parser.print_help()
Run Code Online (Sandbox Code Playgroud)
输出:
usage: test.py [-h] [-a ARGUMENT]
[-u {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}]
Argparse default formatter.
optional arguments:
-h, --help show this help message and exit
-a ARGUMENT, --argument ARGUMENT
not too long
-u {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}, --ugly {0,1,2,3,4,5,6,
7,8,9,10,11,12,13,14,15,16,17,18,19}
looks messy
Run Code Online (Sandbox Code Playgroud)
自定义格式化程序行为
parser = argparse.ArgumentParser(description="Argparse custom formatter.",
formatter_class=CustomFormatter)
parser.add_argument('-a', '--argument', help='not too long')
parser.add_argument('-l', '--less-ugly', choices=range(20), help='less messy')
Run Code Online (Sandbox Code Playgroud)
输出:
usage: test.py [-h] [-a ARGUMENT]
[-l {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}]
Argparse custom formatter.
optional arguments:
-h, --help show this help message and exit
-a ARGUMENT, --argument ARGUMENT
not too long
-l {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19},
--less-ugly {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
less messy
Run Code Online (Sandbox Code Playgroud)
小智 4
为什么不使用 parser.add_argument_group 为基于服务器的选项创建一个组,并给出一个描述 arg 显示可能的选择列表?然后将 argparse.SUPPRESS 传递到每个单独选项的帮助中。我相信这会给你你想要的。