質問

これは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 演算子をサポートするより少ない方法)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top