2011-08-01 4 views
3

問題:返される値がPython辞書であることを確認する必要があります。Pythonでオブジェクト型を正しくチェックするには?

Q1。これらのオプションのどれがこれを行う適切な方法ですか?

type(x) == dict 

type(x) == type(dict) 

isinstance(d, dict) 

は、代わりに==is演算子を使用して、他の変種があります。

Q2。 Many peopleはオブジェクトのタイプをチェックするのは一般的には悪いことだと言いますが、私の初期の問題に関しては他の選択肢がありますか?

+0

は、あなたがそれを辞書である必要がありますまたはあなたがそれにアイテムにアクセスする必要がありますか? – GaretJax

+0

とにかく、あなたがリンクしている質問が答えを提供します。 – GaretJax

+0

@Garet別の辞書を更新するために使用するので、私は辞書にする必要があります。 – Paolo

答えて

8

Q1。これらのオプションのどれがこれを行う適切な方法ですか?

型チェックの時間を無駄にしないでください。

これは仮定に基づいているため、エラーが発生しやすくなります。

Q2。 ...私は他の選択肢がありますか?

はいこれを実行します。

try: 
    x.the_dict_operation() 
except TypeError: 
    # x was not the expected type for the operation 
    raise # or whatever. 

ほとんどの場合、これは「何もしない」ことになります。

コードを書いてください。悪意のある社会病院が間違ったタイプを「何らかの形で」使用していると、それは想定されているようにクラッシュします。

+0

+1大きな感謝、今私は本当に "ダックタイピング"について約理解しています。 – Paolo

+0

このようにして、私はx.the_dict_operationメソッドがやっていたことをやっていると信じなければなりません(私の場合は別の辞書の更新版です)。これは潜在的な問題ではありませんか? – Paolo

+0

@Guandalino:ユーザが提供するdictを使用して独自のdictを更新しているので、あなた自身のdictの '.update()'メソッドが呼び出されています。あなたがそれを信じることができないなら... – kindall

1

タイプを確認するのではなく、__getitem__を確認してください。タイプチェックを本当にしたい場合は、いずれも問題ありません(type(x) == type(dict)を除き、dictインスタンスの場合は決して該当しません)。おそらく最も標準的な方法はisinstanceでしょう。

+0

'__getitem__'はdictとは関係ありません。たくさんのオブジェクトはdictsではない '__getitem__'を持っています。彼がやっていること(オブジェクトが '{} .update'に渡すことができるかどうかをチェックする)には、これは特に間違っています:' __getitem__'を持たない関数に渡すことのできるオブジェクトがあります。彼はオブジェクトが反復可能かどうかをチェックしたい。 –

+0

@Glenn iterated-over要素は反復可能である必要があり、それぞれの要素に2つの要素があるようにする必要があります。 :) –

2

の動作に依存しますが、実際のタイプではありません(他の回答を参照)。

オブジェクトの多くは辞書のように機能することができますが、関数/ APIのユーザーにプレーン・ディクテーションを使用させたくないのでしょうか?実用的な面では

>>> type({}) 
<type 'dict'> 
>>> dict 
<type 'dict'> 
>>> type(dict) 
<type 'type'> 
>>> isinstance({}, dict) 
True 
>>> isinstance("", dict) 
False 
関連する問題