質問
これはPythonレベルでどのように実装されますか?
大部分が辞書のふりをするオブジェクトを持っています(振り返ってみると、辞書をサブクラス化する必要がありますが、コードベースをリファクタリングしたくないので、将来的にはこれも知りたいです参照)、これは少し似たようなものです
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
想定どおりに動作し、configThingerInstance ['whatever']として要素にアクセスしようとすると正しく動作します
ただし、次のような呼び出し
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
doStuff()
「in」プロトコルが問題のキーに対して getitem ()ルックアップを行うため、KeyErrorが発生します。存在しないことを伝えるために、他の例外を発生させる必要がありますか? 私はこのようなことをしたくないのです。
try:
t['DEBUG']
except KeyError:
pass
else:
doStuff()
また、これはドキュメントのどこにありますか?
見回していた
http://docs.python.org/tutorial/datastructures.html
http://docs.python.org/library/stdtypes.html
しかし、「in」という単語に固有の何かをグーグルで検索しようとするのは愚かなことです:(
編集1:
トレースプリントのスタックで、プログラムがconfigThingerInstanceを呼び出すことがわかります。 getitem (0)
ただし
t = {'rawk': 1,
'rawr': 2,
}
t[0] # Raises KeyError
'thing' in t # returns False
解決
in演算子をオーバーロードしたいと思われますか?
これを行うには、メソッド __ contains __
を定義します。 http://docs.python.org/reference/datamodel.html#object。 contains
他のヒント
in
演算子(包含、つまりメンバーシップチェック)を最適にサポートするには、 configThinger
クラスで __ contains __
特別なメソッドを実装します。
class configThinger(object):
_config = {}
def __getitem__(self, key):
return self._config[key]
def __setitem__(self, key, value):
self._config[key] = value
def __contains__(self, key):
return key in self._config
ドキュメントはこちら(説明もあります)その他、 in
演算子をサポートするより少ない方法)。