9.8. functools —呼び出し可能なオブジェクトの高階関数と操作—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/functools
移動先:案内検索

9.8。 functools —呼び出し可能なオブジェクトに対する高階関数と操作

バージョン2.5の新機能。


ソースコード: :source: `Lib / functools.py`



functools モジュールは、高階関数、つまり他の関数に作用するか、他の関数を返す関数用です。 一般に、このモジュールでは、呼び出し可能なオブジェクトを関数として扱うことができます。

functools モジュールは、次の関数を定義します。

functools.cmp_to_key(func)

古いスタイルの比較関数をキー関数に変換します。 キー関数を受け入れるツール( sorted()min()max()、 heapq.nlargest()[X122Xなど)で使用されます]、 heapq.nsmallest()itertools.groupby())。 この関数は主に、比較関数がサポートされなくなったPython3に変換されるプログラムの移行ツールとして使用されます。

比較関数は、2つの引数を受け入れ、それらを比較し、より小さい場合は負の数、等しい場合はゼロ、より大きい場合は正の数を返す呼び出し可能関数です。 キー関数は、1つの引数を受け入れ、ソートキーとして使用される別の値を返す呼び出し可能関数です。

例:

sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order

並べ替えの例と簡単な並べ替えチュートリアルについては、並べ替え方法を参照してください。

バージョン2.7の新機能。

functools.total_ordering(cls)

1つ以上の豊富な比較順序付けメソッドを定義するクラスが与えられると、このクラスデコレータが残りを提供します。 これにより、可能なすべての豊富な比較操作を指定する作業が簡素化されます。

クラスは、__lt__()__le__()__gt__()、または__ge__()のいずれかを定義する必要があります。 さらに、クラスは__eq__()メソッドを提供する必要があります。

例えば:

@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))

バージョン2.7の新機能。

functools.reduce(function, iterable[, initializer])

これは reduce()と同じ関数です。 このモジュールでは、Python3との上位互換性のあるコードを記述できるようになっています。

バージョン2.6の新機能。

functools.partial(func[,*args][, **keywords])

新しい部分オブジェクトを返します。これは、呼び出されると、位置引数 args およびキーワード引数キーワードで呼び出された func のように動作します。 呼び出しにさらに引数が指定されると、それらは args に追加されます。 追加のキーワード引数が指定されている場合、それらはキーワードを拡張およびオーバーライドします。 ほぼ同等:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

partial()は、関数の引数やキーワードの一部を「フリーズ」して、署名が簡略化された新しいオブジェクトを生成する部分関数アプリケーションに使用されます。 たとえば、 partial()を使用して、 int()関数のように動作する呼び出し可能オブジェクトを作成できます。 base 引数のデフォルトは次の2つです。

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18
functools.update_wrapper(wrapper, wrapped[, assigned][, updated])

wrapper 関数を wrapped 関数のように更新します。 オプションの引数は、元の関数のどの属性がラッパー関数の一致する属性に直接割り当てられ、ラッパー関数のどの属性が元の関数の対応する属性で更新されるかを指定するタプルです。 これらの引数のデフォルト値は、モジュールレベルの定数 WRAPPER_ASSIGNMENTS (ラッパー関数の __ name ____ module ____ doc __ に割り当てられます)です。ドキュメント文字列)および WRAPPER_UPDATES (ラッパー関数の __ dict __ を更新します。 インスタンス辞書)。

この関数の主な使用目的は、装飾された関数をラップしてラッパーを返すデコレータ関数です。 ラッパー関数が更新されていない場合、返される関数のメタデータは、元の関数定義ではなくラッパー定義を反映します。これは通常、役に立たないものです。

functools.wraps(wrapped[, assigned][, updated])

これは、ラッパー関数を定義するときに関数デコレータとして update_wrapper()を呼び出すための便利な関数です。 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)と同等です。 例えば:

>>> from functools import wraps
>>> def my_decorator(f):
...     @wraps(f)
...     def wrapper(*args, **kwds):
...         print 'Calling decorated function'
...         return f(*args, **kwds)
...     return wrapper
...
>>> @my_decorator
... def example():
...     """Docstring"""
...     print 'Called example function'
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'

このデコレータファクトリを使用しないと、サンプル関数の名前は'wrapper'になり、元のexample()のdocstringは失われます。

9.8.1。 部分的オブジェクト

partial オブジェクトは、 partial()によって作成された呼び出し可能なオブジェクトです。 これらには、3つの読み取り専用属性があります。

partial.func
呼び出し可能なオブジェクトまたは関数。 partial オブジェクトへの呼び出しは、新しい引数とキーワードを使用して func に転送されます。
partial.args
partial オブジェクト呼び出しに提供される位置引数の前に付加される左端の位置引数。
partial.keywords
partial オブジェクトが呼び出されたときに提供されるキーワード引数。

partial オブジェクトは、呼び出し可能、弱い参照可能、および属性を持つことができるという点でfunctionオブジェクトに似ています。 いくつかの重要な違いがあります。 たとえば、 __ name __ および__doc__属性は自動的に作成されません。 また、クラスで定義された partial オブジェクトは静的メソッドのように動作し、インスタンス属性のルックアップ中にバインドされたメソッドに変換されません。