是否可以为方法编写包装函数?
>>> 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
答案 0 :(得分:8)
你可以简单地做
list(map(str.capitalize, lowtide))
在Python 3.x中,str.capitalize()
是一个采用单个参数self
的函数。
在Python 2.x中,str.capitalize()
是一个“未绑定的方法”,但行为与采用单个参数的函数类似。
答案 1 :(得分:5)
虽然您可以使用str.capitalize
和unicode.capitalize
,但如果您假设某种类型,这些可能会失败......最安全的方法是使用:
from operator import methodcaller
capitalize = methodcaller('capitalize')
这保证了对象使用了正确的方法,并且还允许成功完成鸭子打字。
摘自我的帖子到Google Groups / comp.lang.python 2010年8月23日
使用methodcaller可以让你“保留”Python的鸭子类型 以及子类中任何过度使用的方法。在你的例子中,这个 因为你只处理一个类
,所以可能有点过分另一个(错综复杂的)例子:
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', ',')
答案 2 :(得分:1)
以下是如何重写mef
函数以使其正常工作的方法。使用str.capitalize
的好处是它在Python 2.x上也适用于Unicode字符串:
def mef(m):
def _mef(x):
return getattr(x, m)()
return _mef
list(map(mef('capitalize'), lowtide))
请注意,这与使用lambda x: x.capitalize()
基本相同。