Argparse:制作所需的标志

Posted

技术标签:

【中文标题】Argparse:制作所需的标志【英文标题】:Argparse: Making required flags 【发布时间】:2014-12-01 08:06:09 【问题描述】:

我正在尝试在 Argparse 中创建一个接受输入“filename.pdb”的必需标志“-f”。

这很简单。标准解决方案是添加选项“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】:

这个问题已经在http://bugs.python.org/issue9694、'argparse required arguments displayed under "optional arguments"'讨论过

由于历史实践(在 UNIX 和 Python 中)以及缺乏好的替代方案,这是一个不容易解决的术语问题。

带有像'-f' 这样的“标志”的参数在历史上被称为选项或可选项。通常你不会使用它们,除非你想要一些不同于默认值的值。但是 'argparse' 可以让你指定 required=True,所以现在你有一个 'required optional'。使用nargs='?',可以有不需要的“位置”。

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

参见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

【讨论】:

非常感谢。非常全面且不张扬。

以上是关于Argparse:制作所需的标志的主要内容,如果未能解决你的问题,请参考以下文章

使用特定标志时如何允许省略所需的参数?

如何使用 Python Argparse 制作所需参数的短版本和长版本?

是否可以在没有任何标志的情况下使用 argparse?

为啥 argparse 不能正确解析我的布尔标志? [复制]

使用 argparse 的有序和重复标志

Python Argparse:使用空标志