gpt4 book ai didi

Python 参数解析 : list individual choices in the usage

转载 作者:行者123 更新时间:2023-12-05 08:26:50 28 4
gpt4 key购买 nike

我有一个接受多个参数的程序,例如

breakfast.py --customer=vikings eggs sausage bacon

可以从特定选项列表中指定“鸡蛋”、“香肠”和“培根”。

现在我希望 breakfast.py --help 的输出看起来像这样:

usage: breakfast.py [-h] [--customer CUSTOMER] INGREDIENT [INGREDIENT ...]

positional arguments:
your choice of ingredients:
bacon Lovely bacon
egg The runny kind
sausage Just a roll
spam Glorious SPAM
tomato Sliced and diced

optional arguments:
-h, --help show this help message and exit
--customer CUSTOMER salutation for addressing the customer

我尝试了两种方法,但到目前为止都失败了。

使用参数选择:

import argparse

parser = argparse.ArgumentParser()

toppings = {
'bacon': "Lovely bacon",
'egg': 'The runny kind',
'sausage': 'Just a roll',
'spam': 'Glorious SPAM',
'tomato': 'Sliced and diced',
}
parser.add_argument('--customer', default='Mr. and Mrs. Bun', action='store',
help='salutation for addressing the customer')
parser.add_argument('ingredients', nargs='+', choices=toppings.keys(),
help='your choice of ingredients')

options = parser.parse_args('--customer=Vikings egg sausage bacon'.split())
print("Dear {}, we are happy to serve you {}" \
.format(options.customer, ', '.join(options.ingredients)))

上述程序的用法是打印一个没有详细信息的字典格式的列表:

usage: breakfast.py [-h] [--customer CUSTOMER]
{bacon,egg,sausage,spam,tomato}
[{bacon,egg,sausage,spam,tomato} ...]

positional arguments:
{bacon,egg,sausage,spam,tomato}
your choice of ingredients

metavar='INGREDIENT' 添加到 add_argument('ingredients', ...) 根本不列出选项:

usage: breakfast.py [-h] [--customer CUSTOMER] INGREDIENT [INGREDIENT ...]

positional arguments:
INGREDIENT your choice of ingredients

我曾短暂地尝试过使用子程序:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--customer', default='Mr. and Mrs. Bun', action='store',
help='salutation for addressing the customer')
ingredients = parser.add_subparsers(title='your choice of an ingredient',
dest='ingredient', metavar='ingredient')
ingredients.add_parser('bacon', help="Lovely bacon")
ingredients.add_parser('egg', help="The runny kind")
ingredients.add_parser('sausage', help="Just a roll")
ingredients.add_parser('spam', help="Glorious SPAM")
ingredients.add_parser('tomato', help="Sliced and diced")

options = parser.parse_args('--customer=Vikings spam'.split())
print("Dear {}, we are happy to serve you {}" \
.format(options.customer, options.ingredient))

它以我喜欢的方式列出了用法:

usage: breakfast.py [-h] [--customer CUSTOMER] ingredient ...

optional arguments:
-h, --help show this help message and exit
--customer CUSTOMER salutation for addressing the customer

your choice of an ingredient:
ingredient
bacon Lovely bacon
egg The runny kind
sausage Just a roll
spam Glorious SPAM
tomato Sliced and diced

默认情况下,子程序只允许选择一个选项。还好this answer shows it is possible to allow multiple subcommands ),但这感觉就像是为了获得正确的格式。我最近从 argparse 转移到 ConfigArgParse ,而这种方法在那里失败了。

我认为我最好恢复使用具有多个选项的单个参数,并使用自定义格式。

不幸的是,关于调整 argparse 格式的文档很少,所以我很感激一些帮助如何解决这个问题。

最佳答案

add_argument 更改为:

parser.add_argument('ingredients', nargs='+', choices=toppings.keys(),
metavar='INGREDIENT',
help='your choice of ingredients: %(choices)s')

产生

usage: stack49969605.py [-h] [--customer CUSTOMER] INGREDIENT [INGREDIENT ...]

positional arguments:
INGREDIENT your choice of ingredients: bacon, egg, sausage, spam,
tomato

更改格式化程序:

formatter_class=argparse.RawTextHelpFormatter

add_argument help 参数:

                    help = """
your choice of ingredients:
bacon Lovely bacon
egg The runny kind
sausage Just a roll
spam Glorious SPAM
tomato Sliced and diced
"""
)

产生:

usage: stack49969605.py [-h] [--customer CUSTOMER] INGREDIENT [INGREDIENT ...]

positional arguments:
INGREDIENT
your choice of ingredients:
bacon Lovely bacon
egg The runny kind
sausage Just a roll
spam Glorious SPAM
tomato Sliced and diced

或者您可以使用 argparse.RawDescriptionHelpFormatter,并将格式化的表格放在 descriptionepilog 中。


另一种选择是创建一个模仿 subparsers 类方面的 Action 子类。但这需要更深入地了解如何在格式中处理此 Action 类。

class _SubParsersAction(Action):
class _ChoicesPseudoAction(Action):

subparsers Action 对象维护此 PseudoAction 类的 _choices_actions 列表,仅用于欺骗帮助格式化程序显示子解析器就好像它们是一组嵌套的 Actions。该列表不用于解析;仅用于帮助格式化。

关于Python 参数解析 : list individual choices in the usage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969605/

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