2012-08-06 2 views
8

functools.partial에 대한 문서는 "거의 비슷"이라고 말했다 나는 단지 지시 된 라인을 바꾸어야 만하는 것처럼.구현 functools.partial는

이 코드를 복사 할 때 염려해야 할 다른 기능/문제가 있습니까?

답변

6

_functoolsmodule.c의 소스 코드를 보면 걱정할 것이별로 없다고 생각합니다.

partial의 모듈 구현 산세repr을 처리하지만,이 문서에서와 같이 작동 같은 다른 모든 그래서 아마도 그것은 C에서 구현되는 이유는 바로 효율성이다 보인다. 함수 클로저가 아니라 형식이라는 사실도 있습니다.

그러나 문서 예에서 func, argskeywords은 순수하게 화장품입니다. 실제 functools.partial 인스턴스이므로 오버라이드 할 수 없습니다. 하나 개의 대안은 functools.partial를 서브 클래 싱하는 것입니다 :

class rpartial(partial): 
    def __call__(self, *args, **kwargs): 
     kw = self.keywords.copy() 
     kw.update(kwargs) 
     return self.func(*(args + self.args), **kwargs) 
+0

내장 된 서브 클래스를 생각하지 않았습니까? 클래스 rpartial (부분) : – Dave

+0

이 매우 중요하지만, 나는 그것을 읽어야 생각 데프 __call __ (자기 * 인수, ** kwargs로) : kw = self.keywords.copy() kw.update (kwargs로) return self.func (* (args + self.args), ** kw) – ishmael

+0

@ishmael 감사합니다. – ecatmur

0

하나의 함정은 일부 과제는 다음 예제와 같이 임의의 인수를 처리 할 방법입니다

def f(a,b, *args): 
    pass 

이제 부분적으로 인수 1과 2에 f을 적용

g = partial(f, 1, 2) 

은 무엇인가 b의 값은 g에 있습니까? 1입니까, 아니면 여전히 가치를 기다리고 있습니까? 그렇다면 a 값은 얼마입니까? 다른 말로하면, 제공된 인수의 수는 추가 인수로 처리되어야하는 경우가 많습니다.

+0

이 좋은 주석입니다,하지만 난) ('g를 의미하는 synatax를 선언 할 것 == F (1, 2); g (x) == f (x, 1,2); g (x, y) == f (x, y, 1,2)'등등. 이상 할 수는 있지만 체계적입니다. – Dave