gpt4 book ai didi

python - 使用 argparse.ArgumentParser() 获取分组结构

转载 作者:行者123 更新时间:2023-12-02 08:35:37 25 4
gpt4 key购买 nike

我想翻译如下内容:

test.py --group 1 --opt1 foo1 --opt2 bar1 \
--group 2 --opt1 foo2 \
--group 3 --opt1 foo3 --opt2 bar3 --opt3 baz3

进入类似字典的东西(如命名空间):

{
"1": {"opt1": "foo1",
"opt2": "bar1"},
"2": {"opt1": "foo2"},
"3": {"opt1": "foo3",
"opt2": "bar3",
"opt3": "baz3"}
}
  • 如果需要,输入可以是其他格式。
  • 如果使用 (opt1, opt2, opt3) 以外的其他选项,我想引发错误
  • 我应该使用 argparse.ArgumentParser()。

你能帮忙吗?

最佳答案

看起来是一个很酷的问题 - argparse 允许您以两种方式扩展其回调,要么使用 type=... 自定义类型,要么使用 action= ... 具有自定义行为。我认为 type= 不可能出现上述问题,因此我采用了涉及 action=

的解决方案

编写自定义操作的基本方法包括继承argparse.Action并覆盖__call__(以及可选的__init__)

这是实现您的想法的开始,您可能需要扩展/更改它(例如,在操作类来处理基本行为(对于类型等)——我只是使用最简单的方法来满足您的问题。

import argparse
import pprint


class GroupAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
group, = values
namespace._current_group = group
groups = namespace.__dict__.setdefault('groups', {})
if group in groups:
raise argparse.ArgumentError(self, f'already specified: {group}')
groups[group] = {}


class AppendToGroup(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
value, = values
if not getattr(namespace, '_current_group', None):
raise argparse.ArgumentError(self, 'outside of group!')
namespace.groups[namespace._current_group][self.dest] = value


parser = argparse.ArgumentParser()
parser.add_argument('--group', action=GroupAction)
parser.add_argument('--opt1', action=AppendToGroup)
parser.add_argument('--opt2', action=AppendToGroup)
parser.add_argument('--opt3', action=AppendToGroup)
pprint.pprint(parser.parse_args().groups)

请注意,我使用命名空间来存储状态,因此不幸的是,最终您会得到一些额外的args._current_group

__dict__.setdefault 有点偷偷摸摸,所以我会解释它 - 这是一种稍微简短的编写方式:

if not hasattr(namespace, 'groups'):
namespace.groups = {}
groups = namespace.groups

我使用的基本策略是存储当前组,并在看到其他参数时附加到该组

这是正在运行的示例:

$ python3.7 t.py --group 1 --opt1 a --opt2 b --opt3 c
{'1': {'opt1': 'a', 'opt2': 'b', 'opt3': 'c'}}
$ python3.7 t.py --group 1 --opt1 a --opt2 b --opt3 c --group 2
{'1': {'opt1': 'a', 'opt2': 'b', 'opt3': 'c'}, '2': {}}
$ python3.7 t.py --group 1 --opt1 a --opt2 b --opt3 c --group 2 --opt3 c
{'1': {'opt1': 'a', 'opt2': 'b', 'opt3': 'c'}, '2': {'opt3': 'c'}}
$ python3.7 t.py --group 1 --group 1
usage: t.py [-h] [--group GROUP] [--opt1 OPT1] [--opt2 OPT2] [--opt3 OPT3]
t.py: error: argument --group: already specified: 1
$ python3.7 t.py --opt1 a --group 1
usage: t.py [-h] [--group GROUP] [--opt1 OPT1] [--opt2 OPT2] [--opt3 OPT3]
t.py: error: argument --opt1: outside of group!

关于python - 使用 argparse.ArgumentParser() 获取分组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59062277/

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