ホームページ >バックエンド開発 >Python チュートリアル >抽象基本クラスを使用して、小文字キーを持つ堅牢で柔軟な辞書サブクラスを作成するにはどうすればよいですか?

抽象基本クラスを使用して、小文字キーを持つ堅牢で柔軟な辞書サブクラスを作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-24 03:49:09928ブラウズ

How Can I Create a Robust and Flexible Dictionary Subclass with Lowercase Keys Using Abstract Base Classes?

ABC を使用した「完璧な」辞書サブクラスの実装

この記事では、さまざまなシナリオで理想的に動作する辞書のカスタマイズされたサブクラスを作成する方法を検討します。

課題

私たちの目標は、キーが常に小文字である「dict」のサブクラス。この一見単純なタスクでは、特定のメソッドを慎重にオーバーライドする必要があります。

キー操作メソッドのオーバーライド

目的のキー動作を実現するには、「__getitem__」、「__setitem__」、および「 __delitem__ メソッド。これらのメソッドをカスタマイズすることで、キーの対話をインターセプトし、小文字の変換を強制できます。

ABC による最小限の変換

「dict」を直接サブクラス化する代わりに、ABC (抽象基本クラス) を利用できます。 「collections.abc」モジュール。このアプローチは、よりクリーンで堅牢な実装を提供します。

「MutableMapping」ABC を実装することで、dict インターフェイスへの準拠を保証します。次のコード スニペットは、変換された辞書の最小限の実装を提供します。

from collections.abc import MutableMapping

class TransformedDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))

    def __getitem__(self, key):
        return self.store[self._keytransform(key)]

    def __setitem__(self, key, value):
        self.store[self._keytransform(key)] = value

    def __delitem__(self, key):
        del self.store[self._keytransform(key)]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def _keytransform(self, key):
        return key

キー変換ロジック

「_keytransform」メソッドは、必要な変換をキーに適用する役割を果たします。私たちの場合、単にキーを小文字で返します:

def _keytransform(self, key):
    return key.lower()

継承と拡張

変換された辞書を使用するには、'TransformedDict' をサブクラス化し、目的のキー変換を指定します。 「_keytransform」メソッド。例:

class MyTransformedDict(TransformedDict):

    def _keytransform(self, key):
        return key.lower()

s = MyTransformedDict([('Test', 'test')])

assert s.get('TEST') is s['test']   # free get
assert 'TeSt' in s                  # free __contains__

Pickle とその先

実装された 'TransformedDict' は、内部的に標準の dict に依存しているため、pickle で動作します。

次のことが重要です。 「dict」を直接サブクラス化することは、予期しない動作を引き起こす可能性があるため、一般的に推奨されないことに注意してください。 ABC を利用することで、目的のインターフェイス (この場合は 'MutableMapping') に準拠した堅牢で柔軟なサブクラスを作成できます。

以上が抽象基本クラスを使用して、小文字キーを持つ堅牢で柔軟な辞書サブクラスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。