Argparse: 如何设置必需的标志

10

我试图在Argparse中创建一个必需标志“-f”,该标志接受输入“filename.pdb”。这很简单。标准解决方案是添加选项“required=True”。

不幸的是,即使这样做,“-f”标志仍然出现在帮助列表的可选参数下。更让人困惑的是,“-f”标志在帮助列表中的“用法”提示中出现为必需。

以下是我的代码:

parser = argparse.ArgumentParser()

parser.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file")

parser.add_argument("-bw", "--bin_width",  default=.25, help="enter desired bin width in nanometers. default = .25")

parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP")

args = parser.parse_args()   

这是通过 --help 返回的帮助窗口

usage: rgcalc.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME]

optional arguments:
  -h, --help            show this help message and exit
  -f FILE_NAME, --file_name FILE_NAME
                    enter name of .pdb file
  -bw BIN_WIDTH, --bin_width BIN_WIDTH
                    enter desired bin width in nanometers. default = .25
  -bn BASE_NAME, --base_name BASE_NAME
                    custom prefix for output file naming. default = IDP

如您在“用法”块中所看到的,选项“-f”已经被移除方括号,表明它是必需的。尽管如此,“-f”仍然出现在“可选参数”部分。

请问:

A)是否可以自定义格式化帮助窗口以解决此问题?

或者

B)添加一些代码使标记“-f”,“--file_name”作为位置参数(而不是可选参数),但仍需要标记?

我读到Argparse故意这样做是为了避免位置标记,但我应该这样做以迎合传统的Linux用户。

感谢您的帮助!

1个回答

18

这个问题在http://bugs.python.org/issue9694中已经讨论过,具体是关于'argparse required arguments displayed under "optional arguments"' 的问题。

这是一个术语问题,由于历史上(包括UNIX和Python)的惯例以及缺乏好的替代方案,这个问题不容易解决。

接受“标志”(如'-f')的参数一直被称为选项或可选项。通常情况下,您不会使用它们,除非您需要与默认值不同的某些值。但是'argparse'允许您指定required=True,因此现在您有了一个“必需可选项”。通过nargs='?',可以拥有不需要的“位置参数”。

在Python开发人员提出其他替代术语之前,您最好的选择是使用“ArgumentGroup”,并使用您喜欢的标题和描述。默认情况下,解析器有两个“ArgumentGroups”,即“可选参数”和“位置参数”。它必须将参数放在其中一个中。您可以创建其他组,并根据需要填充它们。

请参阅http://bugs.python.org/issue9694#msg132327(原始argparse开发人员的帖子)。

“用法”行是准确描述参数如何使用以及它们是否需要的行。ArgumentGroups不会影响使用或解析,它们只确定如何分组帮助行。


对于您的代码:

parser = argparse.ArgumentParser()
req_grp = parser.add_argument_group(title='Required Optional')
req_grp.add_argument("-f", "--file_name", required=True, help="enter name of .pdb file")
parser.add_argument("-bw", "--bin_width",  default=.25, help="enter desired bin width in nanometers. default = .25")
parser.add_argument("-bn","--base_name", default="IDP", help="custom prefix for output file naming. default = IDP")
args = parser.parse_args()

"""
usage: stack26227536.py [-h] -f FILE_NAME [-bw BIN_WIDTH] [-bn BASE_NAME]

optional arguments:
  -h, --help            show this help message and exit
  -bw BIN_WIDTH, --bin_width BIN_WIDTH
                        enter desired bin width in nanometers. default = .25
  -bn BASE_NAME, --base_name BASE_NAME
                        custom prefix for output file naming. default = IDP

Required Optional:
  -f FILE_NAME, --file_name FILE_NAME
                        enter name of .pdb file
"""

将此与去掉 -f 标志生成的帮助进行比较:

usage: stack26227536.py [-h] [-bw BIN_WIDTH] [-bn BASE_NAME] file_name

positional arguments:
  file_name             enter name of .pdb file

optional arguments:
  -h, --help            show this help message and exit
  -bw BIN_WIDTH, --bin_width BIN_WIDTH
                        enter desired bin width in nanometers. default = .25
  -bn BASE_NAME, --base_name BASE_NAME
                        custom prefix for output file naming. default = IDP

非常感激。非常全面而又不张扬。 - Jacob C Boswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接