argparse を使用して type=dict の引数を受け入れようとしていますが、入力に関係なく、無効な dict 値というエラーが発生します。
#!/usr/bin/env python
import argparse
MYDICT = {'key': 'value'}
parser = argparse.ArgumentParser()
parser.add_argument("-m", "--mydict", action="store",
required=False, type=dict,
default=MYDICT)
args = parser.parse_args()
print args.mydict
スクリプトに辞書を渡そうとすると、このようなことが起こります
./argp.py -m "{'key1': 'value1'}"
usage: argp.py [-h] [-m MYDICT]
argp.py: error: argument -m/--mydict: invalid dict value: "{'key1': 'value1'}"
書類を見ると、これは可能だと思われます。
argparse は、Python の基本的なライブラリです。
「in 演算子をサポートするオブジェクトはすべて choice 値として渡すことができるため、dict オブジェクト、set オブジェクト、カスタム コンテナーなどがすべてサポートされます。」
ベストアンサー1
文字列から辞書への変換関数が存在しないため、コマンドラインで辞書を引数として渡すことはできないと思います(編集: ハッキングは同様の動作をさせることもできます。下記を参照してください。基本的に Python に指示しているのは次のことです。
dict("{'key1': 'value1'}")
これを Python コンソールで試してみると、動作しません。
フレーズは何ですか:
「in 演算子をサポートする任意のオブジェクトを choice 値として渡すことができるため、dict オブジェクト、set オブジェクト、カスタム コンテナーなどがすべてサポートされます。」
を指すのは選択肢渡すことができる引数引数を追加機能 - ではないタイプ口論。
おそらく、引数を文字列として受け取り、それをjsonPython の機能:
parser.add_argument('-m', '--my-dict', type=str)
args = parser.parse_args()
import json
my_dictionary = json.loads(args.my_dict)
次に、辞書を文字列の形式で渡します。Python コンソールで JSON エンコーダー/デコーダーを実際に試して、どのように動作するかを確認できます。
>>>json.loads('{"value1":"key1"}')
{u'value1': u'key1'}
編集: hpauljは私に「ハッキング」できると指摘しましたタイプパラメータを渡すことによってjson.loadsこれにより、辞書に似た JSON を渡すことができるようになります。
import json
parser.add_argument('-d', '--my-dict', type=json.loads)
args = parse.parse_args()
mydict = args.my_dict # Will return a dictionary
注記: 渡す入力形式はないPython 辞書と同じですが、おそらく使用例には十分似ているでしょう。
これが機能する理由は、内部的にargparseがパラメータ値を引数を変換する関数として使用するため、実は非常に興味深いものです。つまり、type=intの場合はint(arg)を使用し、type=json.loadsの場合はjson.loads(arg)を使用します。
これは、単一のパラメータを受け取る任意の関数を引数として type に渡し、必要に応じてカスタム変換を実行できることも意味します :)