次の 3 つの問題があります。
まず、str.startswith
キーワード引数を取らず、位置引数のみを取ります。これは C で実装されておりPyArg_ParseTuple
、位置引数を取得するために使用します。prefix
名前は docstring にのみ表示されるため、Python に名前を伝えるものは何もありません。それでprefix=
ダメです。この問題は次のようなものです。
>>> str.startswith('#hi', prefix='#')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: startswith() takes no keyword arguments
>>> def foo(self,prefix,start=None,end=None): return str.startswith(self,prefix,start,end)
...
>>> foo('#hi', prefix='#')
True
次に、 の最初の引数は接頭辞でstr.startswith
はなく、接頭辞がself
あるかどうかをチェックするオブジェクトです。メソッドであること自体に問題はありませんstr.isprefixof
。しかし、そうではありません。
最後に、functools.partial
最初の位置引数のみをバインドできます。2 番目をバインドする方法はわかりませんが、最初の引数はバインドできません。バインドしたい引数は最初のものではなく、名前でアクセスできないため、選択肢がありません。
ただし、この場合の回避策として、機能的なスタイルのコードを作成する方法があります。あなただけが必要operator.methodcaller
ですfunctools.partial
:
f_func = operator.methodcaller('startswith', '#')
operator.methodcaller
最初の引数を除くすべての引数をバインドします。
を使用する適切な方法を尋ねるのでfunctools
、引数を逆にする追加の高階関数を使用してそれを行うことができると思います。
def flip(func):
return lambda x,y: func(y,x)
f_func = partial(flip(str.startswith), '#')
ラムダを使用するため、これは「不正行為」と見なすことができます。ラムダを使用したい場合は、ダニエルの回答のように使用します。しかし、Python が提供しない基本的な高階関数を実装するためにそれを使用しています。それが邪魔にならないようにすれば、定義する行f_func
は素晴らしく機能的に感じられます。
注意していただきたいのは、Python の用語で言えば、ここではその高階関数を特にうまくpartial
実装していないということです。func
ユーザーが合理的に提供したい読み取り専用属性もありますflip
。
str.startswith
あるいは、上記のように Python ラッパーを に書き、foo
それに適用partial
することもできます。