2

メソッドのラッパー関数を書くことは可能ですか?

>>> lowtide = [ 'oh', 'i', 'do', 'like', 'to', 'be', 'beside', 'the', 'seaside' ]

>>> [ x.capitalize() for x in lowtide ]
['Oh', 'I', 'Do', 'Like', 'To', 'Be', 'Beside', 'The', 'Seaside']

>>> list(map(lambda x: x.capitalize(), lowtide))
['Oh', 'I', 'Do', 'Like', 'To', 'Be', 'Beside', 'The', 'Seaside']


>>> def mef(m):
...     def _mef(m,x):
...         return x.m()
...     return partial(_mef, m)
... 
>>> list(map(mef(capitalize), lowtide))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'capitalize' is not defined
4

3 に答える 3

8

あなたは簡単に行うことができます

list(map(str.capitalize, lowtide))

Python 3.xでは、str.capitalize()は単一の引数を取る関数selfです。

Python 2.xでは、str.capitalize()は「非バインドメソッド」ですが、単一の引数を取る関数と同様に動作します。

于 2012-07-19T22:47:40.157 に答える
5

とを使用することはできますが、特定のタイプを想定するstr.capitalizeunicode.capitalize、これらは失敗する可能性があります...最も安全な方法は、次を使用することです。

from operator import methodcaller
capitalize = methodcaller('capitalize')

これにより、オブジェクトに正しいメソッドが使用されることが保証され、ダックタイピングを正常に実行することもできます。

私からGoogleGroups/comp.lang.pythonへの投稿からの抜粋2010年8月23日

methodcallerを使用すると、Pythonのダックタイピングとサブクラスのオーバーライドされたメソッドを「保持」できます。あなたの例では、1つのクラスしか扱っていないので、これはおそらくやり過ぎです。

別の(複雑な)例:

class mystr(str):
    def lower(self):
        return self.upper()

>>> s = mystr('abc')
>>> s.lower()
'ABC'

>>> lower = methodcaller('lower')
>>> lower(s)
'ABC'

>>> str.lower(s)
'abc'

^^^おそらく正しくない

また、柔軟性がさらに追加されます(これは、functools.partialでエミュレートできます)。

split_tab = methodcaller('split', '\t')
split_comma = methodcaller('split', ',')
于 2012-07-19T22:56:09.250 に答える
1

mefこれを正しく機能させるために関数を書き直す方法は次のとおりです。ここで使用するよりも利点str.capitalizeは、Python2.xでもUnicode文字列でも機能することです。

def mef(m):
    def _mef(x):
        return getattr(x, m)()
    return _mef

list(map(mef('capitalize'), lowtide))

これは基本的にを使用するのと同じことであることに注意してくださいlambda x: x.capitalize()

于 2012-07-19T22:51:06.537 に答える