我有一本字典,它将人类可读的值映射到三个不同的 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 不会返回 True
、False
或 None
。有没有简单的方法来添加此功能?当然我之后可以执行这样的事情:
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/