我想翻译如下:
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"}
}
你能帮忙吗?你知道吗
似乎是一个很酷的问题
argparse
允许您以两种方式扩展它的回调,一种是针对自定义类型的type=...
,另一种是针对自定义行为的action=...
。我认为上述问题在type=
中是不可能的,所以我使用了一个涉及action=
的解决方案编写自定义操作的基本方法包括从
argparse.Action
继承和重写__call__
(以及可选的__init__
)下面是实现您的想法的一个开始,您可能需要扩展/更改它(例如,在action类中调用
super().__call__(...)
以处理基本行为(对于类型等)可能是有意义的)。我只使用了最简单的方法来满足您的问题。你知道吗注意,这里我使用
namespace
来存储状态,所以不幸的是,最后你会得到一点额外的args._current_group
。你知道吗__dict__.setdefault
有点鬼鬼祟祟,所以我来解释一下,这是一种略短的写作方式:我使用的基本策略是存储当前组,并在看到其他参数时附加到该组
以下是实际操作的示例:
这是我能想到的最好的,希望这就是你想要的。你知道吗
您需要以代码底部显示的形式提供参数,但您在文章中提到这是可以接受的。你知道吗
也就是说,使用
python3 script.py group 1=2=3 opt1 foo1=foo2=foo3 opt2 bar1=None=bar3 opt3 None=None=baz3
来重现我的结果。你知道吗输出:
摘要:
如果需要,输入可以是另一种格式。(检查)
使用与
类似的格式python3 script.py group 1=2=3 opt1 foo1=foo2=foo3 opt2 bar1=None=bar3 opt3 None=None=baz3
如果使用的不是(opt1,opt2,opt3),我想引发一个错误。(检查)
这将在默认情况下使用
argparse
实现,您可以尝试使用opt4
。我应该用argparse.ArgumentParser参数分析器(). (检查)
相关问题 更多 >
编程相关推荐