2016-05-18 3 views
-1

私のpythonプログラムはdictsを使い、検索された値の型をチェックするためだけの膨大な量の "if"文があります。dictでキー(または値)が指定されたデータ型であることを確認する方法は?

私はこれを避けたいが、代わりにそれをプログラム的に正しい方法で行う。ここで

は一例です:

# golddb should only contain str keys and int values 
golddb = dict() 

def gainGold(playername): 
    global golddb 
    golddb[playername] += 1 # error may happen if I try to += a non-int type 
    golddb[playername] = "hello" # I want python to give an error when I try to assign a str to be a value in the dict 
+0

もっとコードを入力してデータの例を入力できますか?質問は不完全です。 –

+0

あなたは 'type()'を知っていますか?あなたの質問は非常に曖昧です。いくつかのコードを提供してください。 –

+0

http://docs.scipy.org/doc/numpy-1.10.1/user/basics.recをチェックしてください。 html –

答えて

2

dictのすべてのキー/値は、あなたがall()機能を使用でき、特定の種類のものであることを確認するには、次のときのタイプを適用するには

if all(isinstance(k, str) for k in playerdb): 
    print("all keys are strs") 

の値を格納するカスタム関数を使用して辞書へのアクセスを仲介することができます。dictをサブクラス化し、__setitem__メソッドをオーバーライドすることができます。例:

>>> class mydict(dict): 
...  def __setitem__(self, key, val): 
...   if not isinstance(key, str): 
...    raise ValueError("key must be a str") 
...   if not isinstance(val, int): 
...    raise ValueError("value must be an int") 
      dict.__setitem__(self, key, val) 
... 
>>> d = mydict() 
>>> d["key"] = 1 
>>> d["key"] = "value" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in __setitem__ 
ValueError: value must be an int 
+0

非常にお手伝いしてありがとう!しかし、私はどのようにしてMydictをJsonPropertyのdictにするのでしょうか?キャスティングは機能しますか? "dict dict" https://cloud.google.com/appengine/docs/python/ndb/entity-property-reference –

+0

@Ryan: 'dict(d)'を使って 'dict'インスタンスを取得できますが、 'mydict' **は' 'dict'だから、これは必要ないはずです –

+0

@eugeney mydictはdictに存在しない新しいメンバーを定義するかもしれないので、mydictをdictにキャストしても問題にならないでしょうか? Pythonはそれをどのように処理しますか?新しいメンバーを無視しますか? –

0

Pythonはタイプセーフではありません。したがって、辞書に格納されている値はどのようなタイプでもかまいません。他の型の値が辞書に追加されないようにする1つの方法は、型が一致する場合にのみデータを追加する関数を定義することです。その後、この関数を使用して辞書に追加します。

def gain_gold(playername, amount): 
    if isinstance(amount, int): 
     playerdb[playername] = amount 
    else: 
     raise Exception('invalid type') 
関連する問題