Duck Typing in Python–3実用的な例

実用的な例

Pythonでは、反復は、特定の操作を実行するために項目のリストに移動することができます。 反復を作成する一般的な方法の1つは、次の一般的な形式を持つforループを使用することです。

for i in iterable:
expression

前回の記事で説明したように、forループでiterableとして使用できるカスタムiteratorを作成できます。 イテレータの”ダックテスト”を満たすために、カスタムクラスは__iter__()メソッドと__next__()メソッドを実装する必要があります。 具体的な例を以下に示します。

イテレータでのダックタイピング

上記のコードスニペットでは、__iter__()__next__()の両方のメソッドを実装し、カスタムクラスCubesイテレータのインスタンスを作成し、インスタンスをforループで使用できるようにしました。

Callables

組み込みのdictデータ型のほかに、別の重要な辞書型はdefaultdictであり、collectionsモジュールで利用できます。 このディクショナリのようなデータ型には、defaultdict(])というコンストラクタがあります。 具体的には、default_factory引数は、関数やラムダ関数などのcallableの型です。

前回の記事では、ラムダ関数を渡すことでdefaultdictを利用できることを示しました。 ここにその使用例があります。

>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()

特に、独自のデフォルトファクトリを作成すると、defaultdictデータ型を使用する柔軟性が向上します。 “Duck typing”の哲学では、カスタムクラスは何かを呼び出すことができるようにする__call__()メソッドを実装する必要があります。 それがどのように動作するか見てみましょう。

Duck Typing in Callables

上記のコードに示すように、DucklingFactoryクラスを作成し、その__call__()関数は1つのDucklingインスタンスのリストを返します。 このファクトリ関数を使用すると、デフォルトのアヒルのリストを乗算することで、必要なアヒルの数を作ることができます。

Len()を使用したソート

ダックタイピングの別の可能な使用法は、sort()関数を使用してリストをソートする際に使用できるカスタムlen()関数を実装するこ 補足として、len()関数は、シーンの背後で__len__()関数を呼び出すことによって実装されているため、魔法関数として参照する人もいます(接頭辞と接尾辞として二重

各アヒルの名前の長さに基づいてアヒルのリストをソートしたいとします。 ここでは、この場合にアヒルのタイピングを適用する方法です。

Duck Typing in Sorting

上記のコードスニペットでは、カスタムNamedDuckクラスは__str__()関数と__len__()関数を実装しており、それぞれ10行目と12行目のインスタンスでstr()関数とlen()関数を使用できます。 重要なことは、あなたが見ることができるように、リストは名前付きのアヒルと文字列と混合されていますが、すべての要素はstr()len()関数を呼び出すことができ、len()をキーとしてリストをソートし、ソートされた結果を出力したいときにリスト内包表記で使用することができます。

したがって、この使用法のより広範な意味は、異なるデータ型の要素の混合リストがある場合、各データ型が同じ関数を実装している限り、要素はduckテストに合格し、適切な操作で適用されるということです。 以下は、strtuple、およびlistのデータ型の混合リストでlen()関数を使用する一般的な使用例です。

>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']

You might also like

コメントを残す

メールアドレスが公開されることはありません。