我想将--arg1 value1
格式的任意一组参数传递给我的python脚本,并在类{'arg1': 'value1}
的字典中检索它们。我想用argparse
来实现这一目标。函数parse_known_args
允许额外的args,但它们可以作为简单列表检索,并且不会被命名。
答案 0 :(得分:2)
更好的想法是定义一个选项,它接受两个参数,一个名称和一个值,并使用自定义操作使用这两个参数更新字典。
class OptionAppend(Action):
def __call__(self, parser, namespace, values, option_string):
d = getattr(namespace, self.dest)
name, value = values
d[name] = value
p.add_argument("-o", "--option", nargs=2, action=OptionAppend, default={})
然后代替myscript --arg1 value1 --arg2 value2
,你会写myscript -o arg1 value1 -o arg2value1
,而args = parser.parse_args()
之后,你会args.o == {'arg1': 'value1, 'arg2': 'value2'}
。
这有点类似于使用列表或字典来保存一组相关变量,而不是一组单独命名的变量。
# Good
v = [x, y, z]
v = { 'key1': x, 'key2': y, 'key3': z}
# Bad
v1 = x
v2 = y
v3 = z
答案 1 :(得分:0)
处理任意键/值对的问题已多次出现。 argparse
没有内置机制。
Is it possible to use argparse to capture an arbitrary set of optional arguments?(几乎与去年五月相同)
您使用parse_know_args
然后从extras
进行自己的字典构建的想法很好 - 也许是最简单的。处理附加列表的方式取决于用户的行为(可预测'--key', 'value'
对)。这与您直接解析sys.arv[1:]
基本相同。
如果用户提供类似--options key1:value1 key2=value2 "key3 value3"
的输入,您可以在自定义Action类中解析这些对(例如,在分隔符上拆分字符串等)。
--options "{key1: value1, key2: value2}"
之类的输入可以作为JSON
字符串处理,其类型函数如下:type=json.load
(我必须查看它)。