2012-07-19 5 views
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 
+1

당신의'mef' 함수는'xm'을'getattr (x, m)'로 바꾸면 작동 될 수 있습니다. –

답변

5

는, 이러한 실패 할 수 있습니다 ... 가장 안전한 방법은 그냥 사용하기 :

객체에 사용되는 올바른 방법을 보장
from operator import methodcaller 
capitalize = methodcaller('capitalize') 

, 또한 오리 타이핑을 성공적으로 수행 할 수 있습니다. 나에게서 Google 그룹에 게시물에서

발췌/comp.lang.python 2010년 8월 23일

사용 methodcaller 당신이 어떤 오버 쟁이으로 잘 파이썬의 오리 타이핑 '보존'을 할 수 있습니다 서브 클래스의 메소드

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', ',') 
+0

+1 methodcaller에 대해 전혀 알지 못했습니다. 매우 흥미로운 – beoliver

8

당신은 단순히 파이썬 3.x의에서

list(map(str.capitalize, lowtide)) 

을 할 수 str.capitalize()는 하나의 인자 self을 복용하는 기능입니다.

파이썬 2.x에서 str.capitalize()은 "언 바운드 메서드"이지만 단일 인수를 갖는 함수와 유사하게 동작합니다.

+0

+1 상황이 간단 할 때 항상 좋은 – beoliver

1

올바르게 작동하려면 mef 함수를 다시 작성하는 방법입니다. 이 본질적으로 lambda x: x.capitalize()를 사용하는 것과 같은 일이다

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

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

참고 : 여기 str.capitalize을 사용하여 이상 장점은 파이썬 2.X에서뿐만 아니라 유니 코드 문자열을 위해 일 것입니다. 당신이 str.capitalizeunicode.capitalize을 사용할 수 있지만 당신이 특정 유형의 가정하면

+0

+1 이것은 내가하려고했던 것이 었습니다. – beoliver

관련 문제