argparse.add_argument()中的type = dict

use*_*296 24 python dictionary argparse

我正在尝试将字典设置为可选参数(使用argparse); 以下是我到目前为止的内容:

parser.add_argument('-i','--image', type=dict, help='Generate an image map from the input file (syntax: {\'name\': <name>, \'voids\': \'#08080808\', \'0\': \'#00ff00ff\', \'100%%\': \'#ff00ff00\'}).')
Run Code Online (Sandbox Code Playgroud)

但是运行脚本:

 $ ./script.py -i {'name': 'img.png','voids': '#00ff00ff','0': '#ff00ff00','100%': '#f80654ff'}

script.py: error: argument -i/--image: invalid dict value: '{name:'
Run Code Online (Sandbox Code Playgroud)

即使在翻译中,

>>> a={'name': 'img.png','voids': '#00ff00ff','0': '#ff00ff00','100%': '#f80654ff'}
Run Code Online (Sandbox Code Playgroud)

工作得很好.

那么我应该如何传递参数呢?提前致谢.

Edd*_*Edd 50

坏死这个:json.loads也在这里工作.它似乎并不太脏.

import json
import argparse

test = '{"name": "img.png","voids": "#00ff00ff","0": "#ff00ff00","100%": "#f80654ff"}'

parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', type=json.loads)

args = parser.parse_args(['-i', test])

print(args.input)
Run Code Online (Sandbox Code Playgroud)

返回:

{u'0': u'#ff00ff00', u'100%': u'#f80654ff', u'voids': u'#00ff00ff', u'name': u'img.png'}


Ham*_*ish 11

为了完整性,与json.loads类似,您可以使用yaml.load(可从PyPI中的PyYAML获得).这比json更有优势,因为不需要在命令行上引用单个键和值,除非您试图将整数强制转换为字符串或以其他方式克服yaml转换语义.但显然整个字符串需要引用,因为它包含空格!

>>> import argparse
>>> import yaml
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-fna', '--filename-arguments', type=yaml.load)
>>> data = "{location: warehouse A, site: Gloucester Business Village}"
>>> ans = parser.parse_args(['-fna', data])
>>> print ans.filename_arguments['site']
Gloucester Business Village
Run Code Online (Sandbox Code Playgroud)

虽然不可否认的是,在给出的问题中,许多关键词和价值观都必须引用或改写,以防止yaml被殴打.如果您需要数字而不是字符串值,使用以下数据似乎非常好用:

>>> parser.add_argument('-i', '--image', type=yaml.load)
>>> data = "{name: img.png, voids: 0x00ff00ff, '0%': 0xff00ff00, '100%': 0xf80654ff}"
>>> ans = parser.parse_args(['-i', data])
>>> print ans.image
{'100%': 4161164543L, 'voids': 16711935, 'name': 'img.png', '0%': 4278255360L}
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 5

我敢打赌,您的shell弄乱了花括号,因为花括号是许多shell中用于花括号扩展功能的语法(请参见此处)。

传递复杂的容器(如字典),要求用户了解Python语法,这在命令行界面中似乎是一个错误的设计选择。相反,我建议您仅在CLI的参数组中一对一地传递选项,然后从解析的组以编程方式构建dict。


use*_*602 5

使用简单的 lambda 解析非常灵活:

parser.add_argument(
    '--fieldMap',
    type=lambda x: {k:int(v) for k,v in (i.split(':') for i in x.split(','))},
    help='comma-separated field:position pairs, e.g. Date:0,Amount:2,Payee:5,Memo:9'
)
Run Code Online (Sandbox Code Playgroud)


fra*_*eye 5

type=在我看来,将@Edd 的文章和@Bradley 的文章结合起来ast.literal_eval会产生最直接的解决方案。它允许直接检索 argval,甚至采用字典的(引用的)默认值:

代码片段

parser.add_argument('--params', '--p', help='dict of params ', type=ast.literal_eval, default="{'name': 'adam'}")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

运行代码

python test.py --p "{'town': 'union'}"
Run Code Online (Sandbox Code Playgroud)

请注意 dict 值的引号。此引用适用于 Windows 和 Linux(使用 [t]csh 测试)。

找回阿格瓦尔

dict=args.params
Run Code Online (Sandbox Code Playgroud)