【问题标题】:python read in multiple key value (dict) from command line into a variablepython从命令行将多个键值(dict)读入变量
【发布时间】:2013-09-18 23:14:41
【问题描述】:

在 Perl 中,可以使用 Getopt::Long 轻松将多个 key=value 对读入一个变量 (a hash)(参见 here

基本上是这样的

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

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

【问题讨论】:

  • argparse 样式输入更像:python stack18800328.py --os=linux --vendor=redhat。但这需要提前知道可能的“关键”值。
  • define 作为append 中的argparse 参数,后跟这个衬里是我能想到的最紧凑的方式:args.define = {k:v for k,v in (a.split('=') for a in args.define)}

标签: python dictionary hash command-line


【解决方案1】:

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) 来解决此问题。

【讨论】:

  • 我知道这种解决方法 [虽然不完全是您编写的方式],我一直在使用它。但是,我只是想知道那里是否已经有一些 python 模块 [比如 perl 的 getopt] 可以在不添加额外行的情况下完成它。到目前为止,我没有找到。不过感谢您的回复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2018-11-14
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多