辞書リテラルのように見えるものを引数パーサーに確実に入れることができますが、それを引用する必要があるため、シェルがコマンドラインを解析すると、次のようになります。
- 多くの代わりに単一の引数 (スペース文字は通常の引数区切り文字です)
- 適切に引用されている (シェルは、引用符をグループ化に使用しているため、解析中に引用符を削除します)
したがって、次のようなもので、必要なテキストをプログラムに取得できます。
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'}