문제

이것은 matplotlib의 csv2rec의 소스 코드에서 나온 것입니다.

이 함수만이 'func, default'인 경우 어떻게 작동 할 수 있습니까?

def with_default_value(func, default):
    def newfunc(name, val):
        if ismissing(name, val):
            return default
        else:
            return func(val)
    return newfunc

Ismissing은 이름과 값을 가져 와서 행을 멍청한 배열로 마스킹 해야하는지 결정합니다.

func는 str, int, float 또는 dateparser입니다. 데이터를 변환합니다. 중요하지 않을 수도 있습니다. 나는 그것이 어떻게 '이름'과 'value'를 얻을 수 있는지 궁금합니다.

나는 초보자입니다. 2 센트에 감사드립니다! 나는 다른 사람들을 도울 정도로 충분히 얻기를 희망합니다!

도움이 되었습니까?

해결책

이것 with_default_value 기능은 종종 (부적절하게) "폐쇄"라고하는 것입니다 (기술적으로는 폐쇄는 오히려 안의 여기에서 반환되는 기능 newfunc - 예를 들어보십시오 여기). 더 일반적으로 with_default_value a 고차 기능 ( "HOF") : 함수가 필요합니다 (func) 인수로서, 그것은 또한 함수를 반환합니다 (newfunc) 결과로서.

나는 이것을 혼란스럽게하는 대답을 보았다 데코레이터 파이썬의 개념과 구성 ~ 아니다 사건 - 특히 언급 한 이후 func 종종 등장하는 것입니다 int. 데코레이터는 또한 고차 기능이지만 오히려 특정 기능입니다. 장식 된 "농축", 기능 인수 버전 ( 인수 - "인수가있는 데코레이터"는 한 가지 수준의 기능/클로저 중첩을 통해 얻습니다. ~ 아니다 Decorator HOF에게 하나 이상의 인수를 제공함으로써 해당 기능 인수와 정확히 동일한 이름으로 재 할당됩니다 (일반적으로 동일한 서명이 있습니다. 그렇지 않으면 데코레이터를 사용하여 그렇지 않으면 극도로 독특하고, 비 분리, 읽을 수없는 등)).

따라서 사건과 전혀 관련이없는 데코레이터를 잊고 newfunc 폐쇄. 어휘 중첩 된 함수는 둘러싸는 기능의 모든 로컬 변수 이름 (인수 이름 포함)을 참조 할 수 있습니다. "무료 변수". 여기, newfunc 참조 할 수 있습니다 func 그리고 default - 그리고 그렇습니다.

고차 기능은 파이썬에서 매우 자연스러운 것입니다. 특히 함수는 일류 개체이기 때문에 (따라서 인수로 전달하거나 기능 값으로 반환하거나 목록 또는 기타 컨테이너에 저장하는 데 필요한 특별한 것은 없습니다. 등), 그리고 함수와 다른 종류의 객체 사이에는 네임 스페이스 차이가 없으며, 언급하기 때문에 기능의 자동 호출 등이 없습니다. 그것은 이런 종류의 많은 차이를 이끌어냅니다). 파이썬에서는 함수를 언급하는 것이 그저 언급입니다. 호출은 함수 객체 (이름으로, 또는 다른 방법으로 참조)에 이어 괄호 안에있는 경우에만 발생합니다.

그것은이 예에 대한 모든 것입니다. 의심의 여지가없는 다른 특정 측면이 있다면 질문을 편집하고 여기에 의견을주십시오.

편집하다: 그래서 OP는 "클로저 공장"의 더 많은 예를 구하기 위해 정중하게 언급했다. 다음은 다음과 같습니다. 추상적 인 종류의 GUI 툴킷을 상상해보십시오.

for i in range(len(buttons)):
  buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))

그러나 이것은 제대로 작동하지 않습니다. ilambda 늦은 부분이므로 하나의 버튼을 클릭 할 때까지 i의 가치는 항상의 색인이 될 것입니다. 마지막 클릭 한 버튼. 다양한 실행 가능한 솔루션이 있지만 폐쇄 공장의 우아한 가능성이 있습니다.

def makeOnclick(message):
  return lambda: mainwin.settitle(message)

for i in range(len(buttons)):
  buttons[i].onclick(makeOnClick("button %d click!" % i))

여기서 우리는 폐쇄 공장을 사용하여 변수의 바인딩 시간을 조정합니다!-) 하나의 특정 형태 또는 다른 형태로, 이것은 폐쇄 공장의 일반적인 사용 사례입니다.

다른 팁

이것은 파이썬 데코레이터 - 기본적으로 기능 래퍼입니다. (PEP 318의 데코레이터에 관한 모든 것을 읽으십시오 - http://www.python.org/dev/peps/pep-0318/)

코드를 살펴보면 다음과 같은 것을 찾을 수 있습니다.

def some_func(name, val):
    # ...
some_func = with_default_value(some_func, 'the_default_value')

이 데코레이터의 의도는 이름이나 val 인수가 누락 된 경우 (아마도 없음으로 설정된 경우) 기본값을 제공하는 것 같습니다.

그것이 작동하는 이유 :

with_default_value with_default_value는 기본적으로 기능 객체를 반환합니다. 복사 그 중첩 된 NewFunc의 'func'호출 및 기본값은 with_default_value로 전달 된 것과 대체 된 기본값입니다.

누군가가 'foo = with_default_value (bar, 3)'을하는 경우, 반환 값은 기본적으로 새로운 기능이 될 것입니다.

def foo(name, val):
    ifismissing(name, val):
        return 3
    else:
        return bar(val)

그러면 그 반환 가치를 가져 와서 호출 할 수 있습니다.

이것은 다른 함수를 반환하는 함수입니다. name 그리고 value 반환 된 함수의 매개 변수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top