Argparse:制作必需的标志

时间:2014-10-07 00:26:10

标签: python argparse flags required

我正在尝试创建一个必需的标志“-f”,它接受Argparse中的输入“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 个答案:

答案 0 :(得分:10)

此问题已在http://bugs.python.org/issue9694'argparse required arguments displayed under "optional arguments"'

中讨论过

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

带有'-f'之类“旗帜”的参数历来被称为期权或期权。通常,除非您想要一些与默认值不同的值,否则不要使用它们。但是'argparse'允许你指定required=True,所以现在你有'必需的可选'。使用nargs='?',可以获得不需要的“位置”。

在Python开发人员提出一些替代术语之前,您最好的选择是使用'ArgumentGroup',其中包含您喜欢的标题和描述。默认情况下,解析器有2个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