python argparse参数顺序
是否有任何方法可以使用argparse模块手动排序参数 现在我有这个:python argparse参数顺序,python,parameters,argparse,Python,Parameters,Argparse,是否有任何方法可以使用argparse模块手动排序参数 现在我有这个: usage: cons_test.py [-h] [-l L] [-R] [-O O] [-o O] [-T T] <STR_file> <PDB_file> 用法:cons_test.py[-h][-l][-R][-O][-O][-T] 但我希望在可选参数之前有位置(因此不是可选的)参数,如下所示: usage: cons_test.py <STR_file> <PDB_fil
usage: cons_test.py [-h] [-l L] [-R] [-O O] [-o O] [-T T] <STR_file> <PDB_file>
用法:cons_test.py[-h][-l][-R][-O][-O][-T]
但我希望在可选参数之前有位置(因此不是可选的)参数,如下所示:
usage: cons_test.py <STR_file> <PDB_file> [-h] [-l L] [-R] [-O O] [-o O] [-T T]
用法:cons_test.py[-h][-l][-R][-O][-O][-T]
要实现此订单,我应该对代码进行哪些修改?必须提供您自己的代码。创建一个反转可选参数和位置参数的方法可以使用子类来完成,但请注意,这依赖于可以在Python版本之间更改的内部方法 以下类将在Python2和Python3中工作,因为重写的方法仍以相同的方式调用,但仅用于终端宽度内的文本拟合(使用
COLUMNS
环境变量,默认为80列减去2个字符填充):
告诉argparse
在创建参数解析器时使用此选项:
parser = argparse.ArgumentParser(
# ....
formatter_class=SwappedOrderHelpFormatter,
# ....
)
如果文本不适合大多数端子宽度,则需要完全重新定义,并交换选项
和位置
变量的顺序
演示:
Martijn Pieters解决方案的一个变体-去掉所有换行,并按定义的顺序显示参数
class RawUsageHelpFormatter(argparse.HelpFormatter):
def _format_usage(self, usage, actions, groups, prefix):
# use actions in the order that they are define
# no line wrapping
if prefix is None:
prefix = 'usage: '
if usage is not None:
usage = usage % dict(prog=self._prog)
elif usage is None and not actions:
usage = '%(prog)s' % dict(prog=self._prog)
elif usage is None:
prog = '%(prog)s' % dict(prog=self._prog)
format = self._format_actions_usage
action_usage = format(actions, groups)
usage = ' '.join([s for s in [prog, action_usage] if s])
return '%s%s\n\n' % (prefix, usage)
样本输出:
usage: stack24221824.py [-h] <STR_file> [-t T] <PDB_file> [-l {txt,html,pdf}] [-R] [-O {txt,html,pdf}]
用法:stack24221824.py[-h][-t][-l{txt,html,pdf}][-R][-O{txt,html,pdf}]
[-h]
是第一个,因为解析器会立即创建它。然后我定义了STR
、-t
、PDB
,等等。如果需要,我认为您可以使用add\u help=True
来抑制帮助,然后定义自己的-h
参数。如果您想要换行,您必须考虑允许在何处拆分行,以及后续行的缩进。我相信您必须进行进一步的更改以处理长时间的多行使用。@hpaulj:啊,我明白您的意思了如果len(前缀)+len(用法)>文本宽度:
则位置与选项分开格式化。这种\u格式\u用法
方法是脆弱的。它从\u format\u actions\u usage
获取一个字符串,并尝试将其拆分为actions
和group
单元,然后将它们拼接回行。我的补丁是对这些方法的重写。@hpaulj:HelpFormatter类的整个HelpFormatter实际上是非常脆弱的。在一个单独的脚本中,你的代码可以工作,但只要我添加一个新参数,即parser.add_参数(“-O”,“--output_file_name”,choices=[“txt”,“html”,default=“txt | html”,help=“output file name”)
顺序恢复正常:用法:SwappedOrder.py[-h][l{bic,pf1}][R][O{txt,html}]STR_文件PDB_文件
是什么让一些参数工作而另一些不工作?我是否缺少Am参数选项?最简单的步骤,尤其是一次性使用,是编写自己的用法
行。
class RawUsageHelpFormatter(argparse.HelpFormatter):
def _format_usage(self, usage, actions, groups, prefix):
# use actions in the order that they are define
# no line wrapping
if prefix is None:
prefix = 'usage: '
if usage is not None:
usage = usage % dict(prog=self._prog)
elif usage is None and not actions:
usage = '%(prog)s' % dict(prog=self._prog)
elif usage is None:
prog = '%(prog)s' % dict(prog=self._prog)
format = self._format_actions_usage
action_usage = format(actions, groups)
usage = ' '.join([s for s in [prog, action_usage] if s])
return '%s%s\n\n' % (prefix, usage)
usage: stack24221824.py [-h] <STR_file> [-t T] <PDB_file> [-l {txt,html,pdf}] [-R] [-O {txt,html,pdf}]