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)
使用简单的 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)
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)