gpt4 book ai didi

python - 扩展 argparse 以在可选参数选择的帮助文本中写入集合名称,并在末尾定义这些集合

转载 作者:太空狗 更新时间:2023-10-29 17:38:51 27 4
gpt4 key购买 nike

问题示例

如果我有一个在多个参数之间共享的有效选项字符串列表,该列表将写在帮助字符串的多个位置。使其更难阅读:

def main():
elements = ['a', 'b', 'c', 'd', 'e', 'f']

parser = argparse.ArgumentParser()
parser.add_argument(
'-i',
nargs='*',
choices=elements,
default=elements,
help='Space separated list of case sensitive element names.')
parser.add_argument(
'-e',
nargs='*',
choices=elements,
default=[],
help='Space separated list of case sensitive element names to '
'exclude from processing')

parser.parse_args()

当使用命令行参数 --help 运行上述函数时,它显示:

usage: arguments.py [-h] [-i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]
[-e [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]

optional arguments:
-h, --help show this help message and exit
-i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]
Space separated list of case sensitive element names.
-e [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]
Space separated list of case sensitive element names
to exclude from processing

什么会更好

如果可以定义一个选项列表名称,并在帮助输出中将选项列表名称写在多个位置并在最后定义它,那就太好了。理论上它会像这样工作:

def main_optionlist():
elements = ['a', 'b', 'c', 'd', 'e', 'f']

# Two instances of OptionList are equal if and only if they
# have the same name (ALFA in this case)

ol = OptionList('ALFA', elements)

parser = argparse.ArgumentParser()
parser.add_argument(
'-i',
nargs='*',
choices=ol,
default=ol,
help='Space separated list of case sensitive element names.')
parser.add_argument(
'-e',
nargs='*',
choices=ol,
default=[],
help='Space separated list of case sensitive element names to '
'exclude from processing')

parser.parse_args()

当使用命令行参数 --help 运行上述函数时,它会显示类似于以下内容:

usage: arguments.py [-h] [-i [ALFA [ALFA ...]]]
[-e [ALFA [ALFA ...]]]

optional arguments:
-h, --help show this help message and exit
-i [ALFA [ALFA ...]]
Space separated list of case sensitive element names.
-e [ALFA [ALFA ...]]
Space separated list of case sensitive element names
to exclude from processing
sets in optional arguments:
ALFA {a,b,c,d,e,f}

问题

我需要:

  • 将可选参数中显示的 {'l', 'i', 's', 't', 's'} 替换为选项名称。
  • 在帮助文本的末尾显示一个部分,解释每个选项名称由哪些元素组成。

所以我问:

  1. 这可能使用 argparse 吗?
  2. 我必须继承哪些类以及我需要重写哪些方法?

我已经尝试查看 argparse 的源代码,但由于这种修改感觉非常高级,我不知道如何着手。

最佳答案

我的回答根本没有尝试扩展 argparse,而是按原样使用 argparse 的可用选项...这能解决您的情况吗?

import argparse
import textwrap

def main():
elements = ['a', 'b', 'c', 'd', 'e', 'f']

parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog = textwrap.dedent('''\
sets in optional arguments:
ALFA\t\t{a,b,c,d,e,f}"
'''))

parser.add_argument(
'-i',
nargs='*',
choices=elements,
default=elements,
metavar="ALFA",
help='Space separated list of case sensitive element names.')
parser.add_argument(
'-e',
nargs='*',
choices=elements,
default=[],
metavar="ALFA",
help='Space separated list of case sensitive element names to '
'exclude from processing')

parser.parse_args()

输出

usage: test.py [-h] [-i [ALFA [ALFA ...]]] [-e [ALFA [ALFA ...]]]

optional arguments:
-h, --help show this help message and exit
-i [ALFA [ALFA ...]] Space separated list of case sensitive element names.
-e [ALFA [ALFA ...]] Space separated list of case sensitive element names
to exclude from processing

sets in optional arguments:
ALFA {a,b,c,d,e,f}"

这种方法的好处在于,您可以为每个标志随意命名元变量,并且您也可以手动设置 epilog 的格式以反射(reflect)任何格式描述。无需子类化。

关于python - 扩展 argparse 以在可选参数选择的帮助文本中写入集合名称,并在末尾定义这些集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com