pythonのpartial()の使い方説明

2685 ワード

functoolsモジュールには、関数のパラメータを「フリーズ」し、パラメータを「フリーズ」した後の新しい関数を返すツールpartial()があります.
簡単な解釈で、公式マニュアルの例でもあります.int()関数では、与えられた数値を10進数整数に変換し、変換時に与えられた数を数進数で解析するように指定できます.例:
#  10    123,    10    
>>> int("123")
123

#  2    10101,    10    
>>> int("10101", base=2)
21

#  13    "abc12c",    10    
>>> int("abc12c", base=13)
4053672

このようにbase=2パラメータを指定してバイナリを10進数整数に変換するのではなく、通常の関数のように変換する値を直接指定すればよい.そこで、int()をカプセル化するために別の関数を定義します.例えば、
def inttwo(x):
    return int(x, base=2)

inttwo("10101")

functoolsで提供されているpartial()は、似たようなことをしています.
inttwo = partial(int, base=2)

int()で指定されたパラメータbase=2、すなわち、このパラメータが「凍結」されていることを示します.
>>> from functools import partial
>>> inttwo = partial(int,base=2)
>>> inttwo("10101")
21

「フリーズ」に引用符を付けたのは、inttwo()でpartial()の「フリーズ」パラメータを上書きするためにパラメータを再指定できるからです.
>>> inttwo("10101",base=10)
10101

partial()の定義を振り返ってみます.
functools.partial(func, *args, **keywords)

その定義から分かるように,int()のbaseのようなkwパラメータフォーマットだけでなく,位置パラメータargsも同様に「凍結」できる.
partial()は、3つの特殊な属性を含むpartialオブジェクトを返します.
>>> dir(inttwo)
[...... 'args', 'func', 'keywords']
  • funcは、オブジェクトがカプセル化する元の関数
  • を表す.
  • args「フリーズ」を表す位置パラメータリスト
  • keywords「フリーズ」を表すキーワードパラメータ
  • >>> inttwo.func
    
    >>> inttwo.args
    ()
    >>> inttwo.keywords
    {'base': 2}

    またpartial()は、注釈ドキュメント、注釈など、パッケージ関数のメタデータを保持しないことに注意してください.
    >>> def myfunc(x:int, y:int) -> int:
    ...     ''' sum x + y '''
    ...     return x + y
    
    
    #        
    >>> myfunc.__doc__
    ' sum x + y '
    >>> myfunc.__annotations__
    {'x': , 'y': , 'return': }
    
    # partial()      ,       
    >>> newfunc = functools.partial(myfunc,y=3)

    したがって、これらのメタデータが必要な場合は、partialオブジェクトにメタデータを手動で割り当てる必要があります.
    >>> newfunc.__doc__ = myfunc.__doc__
    >>> newfunc.__annotations__ = myfunc.__annotations__
    >>> newfunc.__doc__
    ' sum x + y '
    >>> newfunc.__annotations__
    {'x': , 'y': , 'return': }

    最後に、partial()は関数のパラメータを「凍結」できるほか、functoolsはpartialmethod()メソッドのパラメータを「凍結」することも提供しているが、基本的には使えず、partial()もあまり使われていない.