你绝对可以在参数解析器中输入一些看起来像字典文字的东西,但是你必须引用它,所以当 shell 解析你的命令行时,它会以
- 单个参数而不是多个参数(空格字符是正常的参数分隔符)
- 正确引用(shell 在解析过程中删除引号,因为它使用它们进行分组)
所以这样的事情可以让你想要的文本进入你的程序:
python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
但是,此字符串不是 dict 构造函数的有效参数;相反,它是一个有效的 python 代码片段。你可以告诉你的参数解析器这个参数的“类型”是eval
,这将起作用:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=eval, help='Generate an image map...')
args = parser.parse_args()
print args
并称它为:
% python MYSCRIPT.py -i "{\"name\": \"img.png\", \"voids\": \"#00ff00ff\",\"0\": \"#ff00ff00\",\"100%\": \"#f80654ff\"}"
Namespace(image={'0': '#ff00ff00', '100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png'})
但这并不安全;输入可以是任何东西,并且您正在评估任意代码。它同样笨拙,但以下会更安全:
import argparse
import ast
parser = argparse.ArgumentParser()
parser.add_argument('-i','--image', type=ast.literal_eval, help='Generate an image map...')
args = parser.parse_args()
print args
这也有效,但对允许的内容有更多限制eval
。
尽管如此,让用户在命令行上输入一些看起来像 python 字典的东西,正确引用,还是非常笨拙的。而且,您必须在事后进行一些检查,以确保它们通过字典而不是其他可评估的东西,并且其中包含正确的键。在以下情况下更容易使用:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--image-name", required=True)
parser.add_argument("--void-color", required=True)
parser.add_argument("--zero-color", required=True)
parser.add_argument("--full-color", required=True)
args = parser.parse_args()
image = {
"name": args.image_name,
"voids": args.void_color,
"0%": args.zero_color,
"100%": args.full_color
}
print image
为了:
% python MYSCRIPT.py --image-name img.png --void-color \#00ff00ff --zero-color \#ff00ff00 --full-color \#f80654ff
{'100%': '#f80654ff', 'voids': '#00ff00ff', 'name': 'img.png', '0%': '#ff00ff00'}