python - 为 Python argparse 使用字典

标签 python dictionary argparse

我有一本字典,它将人类可读的值映射到三个不同的 Python 特定值。 argparse Python 模块如何使用这个字典来获取特定值,同时用户可以在键之间进行选择。

目前我有这个:

def parse(a):
    values = { "on": True, "off": False, "switch": None }
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--value", choices=values, default=None)
    args = parser.parse_args(a)
    print("{}: {}".format(type(args.value), args.value))

>>> parse(['-v', 'on'])
<type 'str'>: on
>>> parse(['-v', 'off'])
<type 'str'>: off
>>> parse(['-v', 'switch'])
<type 'str'>: switch
>>> parse([])
<type 'NoneType'>: None

问题是,如果给定参数,argparse 不会返回 TrueFalseNone。有没有简单的方法来添加此功能?当然我之后可以执行这样的事情:

args.value = values[args.value]

这实际上是我目前正在做的事情,但这不适用于默认值(我必须检查该值是否已经为 None 或将默认值设置为 "switch").由于我多次使用它,所以我每次都必须这样做。

最佳答案

最小的改变是使用

args.value = values.get(args.values)

因此对于不在字典中的任何条目(例如默认值),您将得到 None。

另一种选择是滥用 argparse 的 type 关键字:

values = { "on": True, "off": False, "switch": None }
def convertvalues(value):
    return values.get(value)
parser.add_argument('-v','--value',type=convertvalues)

“类型”方法打破了上面使用的选择的使用,因为选择是在转换之后应用的。保留您对选择的使用的一种可能性是:

def convertvalues(value):
     return values.get(value,value)
parser.add_argument('-v','--value',type=convertvalues,
                                   choices=[True,False,None],
                                   default=None)

在这种情况下,如果使用 'on'、'off'、'switch' 和 None,则 convertvalues 返回正确的值,如果给出其他内容(例如,'bla'),则返回给定的值。由于“bla”不在选项中,您会收到预期的错误消息。

将“action”与从 argparse.Action 派生的类一起使用而不是类型应该以聪明的方式完成这项工作,如 docs 中给出的那样:

class DictAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        value_dict = { "on": True, "off": False, "switch": None }
        setattr(namespace, self.dest, value_dict.get(values))
parser.add_argument('-v','--value',action=DictAction,
                                   choices=['on','off','switch'],
                                   default=None)

当然这并不完美,更好的解决方案是覆盖 Acion init 以获取字典并省略硬编码的 value_dict。

关于python - 为 Python argparse 使用字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22635675/

相关文章:

python - 类型错误 : string indices must be integers When Checking array with dictionaries

python - 如何使命令行参数充当标志或解析值?

Python argparse 值范围帮助消息外观

python - 在 numpy 中,计算一个矩阵,其中每个单元格包含该行中所有其他条目的乘积

python - 查看数据帧的行,如果行上的大多数项目也是 x,则返回结果(x)

c++ - 从 initializer_list 错误构造 std::map

python - 从文件中读取特定的单词和值并将它们存储在字典中

python - Python 中多行变成单行

python - 在python中获取数组中具有定义值的最高索引

带有换行的 Python argparse.RawTextHelpFormatter