Вы можете определенно добавить что-то, похожее на буквальный литерал, в анализатор аргументов, но вы должны заключить его в кавычки, поэтому, когда оболочка анализирует вашу командную строку, она появляется как
- один аргумент вместо многих (символ пробела является нормальным разделителем аргумента)
- правильно цитируется (оболочка удаляет кавычки во время синтаксического анализа, потому что использует их для группировки)
Так что-то вроде этого может получить желаемый текст в вашу программу:
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
'd.
Тем не менее, очень неудобно, когда пользователь печатает что-то, правильно заключенное в кавычки, которое выглядит как словарь 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'}