pythonのpartial()の使い方説明
2685 ワード
functoolsモジュールには、関数のパラメータを「フリーズ」し、パラメータを「フリーズ」した後の新しい関数を返すツールpartial()があります.
簡単な解釈で、公式マニュアルの例でもあります.int()関数では、与えられた数値を10進数整数に変換し、変換時に与えられた数を数進数で解析するように指定できます.例:
このように
functoolsで提供されているpartial()は、似たようなことをしています.
int()で指定されたパラメータbase=2、すなわち、このパラメータが「凍結」されていることを示します.
「フリーズ」に引用符を付けたのは、inttwo()でpartial()の「フリーズ」パラメータを上書きするためにパラメータを再指定できるからです.
partial()の定義を振り返ってみます.
その定義から分かるように,int()のbaseのようなkwパラメータフォーマットだけでなく,位置パラメータargsも同様に「凍結」できる.
partial()は、3つの特殊な属性を含むpartialオブジェクトを返します. を表す.
またpartial()は、注釈ドキュメント、注釈など、パッケージ関数のメタデータを保持しないことに注意してください.
したがって、これらのメタデータが必要な場合は、partialオブジェクトにメタデータを手動で割り当てる必要があります.
最後に、partial()は関数のパラメータを「凍結」できるほか、functoolsはpartialmethod()メソッドのパラメータを「凍結」することも提供しているが、基本的には使えず、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()もあまり使われていない.