2

在 Perl 中,可以使用(参见此处)轻松地将多key=value对读入变量 ( )a hashGetopt::Long

基本上它说

 GetOptions ("define=s" => \%defines);
 And on command line: <prog> --define os=linux --define vendor=redhat

我一直在寻找一个等价物,Python但到目前为止还没有发现 [ argparse] 没有从 bash shell 中获取字典,很容易在 argparse.add_argument() 中看到 type=dict。尽管我可以通过读取参数并以编程方式从中创建字典来解决此问题,但我只是想知道一种干净简单的方法(就像 Perl 一样)

4

1 回答 1

4

与自定义操作一起使用argparse

import argparse
import copy


class DictAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        try:
            k, v = values.split("=", 1)
        except ValueError:
            raise argparse.ArgumentError(self, "Format must be key=value")

        # Implementation is from argparse._AppendAction
        items = copy.copy(argparse._ensure_value(namespace, self.dest, {}))  # Default mutables, use copy!
        items[k] = v
        setattr(namespace, self.dest, items)

# Usage:
parser = argparse.ArgumentParser()
parser.add_argument("--define", action=DictAction)

print parser.parse_args("--define k=v --define x=y".split())
# Gives
# Namespace(d={'x': 'y', 'k': 'v'})

print parser.parse_args("--define k=v --define x=y --define z".split())
# Gives
# usage: args.py [-h] [--define D]
# args.py: error: argument --define: Format must be key=value

请注意,这不支持在参数中使用等号,但您可以扩展“哑”k, v = values.split("=", 1)来解决此问题。

于 2013-09-14T09:48:17.063 回答