python 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

是否有任何方法可以使用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_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}]