是否可以将字符串方法视为函数?

时间:2012-07-19 22:46:31

标签: python function methods

是否可以为方法编写包装函数?

>>> 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

3 个答案:

答案 0 :(得分:8)

你可以简单地做

list(map(str.capitalize, lowtide))

在Python 3.x中,str.capitalize()是一个采用单个参数self的函数。

在Python 2.x中,str.capitalize()是一个“未绑定的方法”,但行为与采用单个参数的函数类似。

答案 1 :(得分:5)

虽然您可以使用str.capitalizeunicode.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()基本相同。