2014-01-19 3 views
1

하나의 함수 인수를 받고 그 함수 인수도 하나의 인수를 받지만이 인수를 Python의 인수 함수에 전달하는 방법을 모르겠습니다.파이썬에서 함수 인수에 대한 인수를 보내십시오.

def pr(text): 
    print(text) 

def frun(func): 
    func() 

frun(pr) 

문제는 내가 frun(pr)에서 text 인수를 전달할 수있는 방법이다 : 다음 샘플 코드는? 그리고 키워드 인수 사용에 대해서도 고려해보십시오. 이 같은 변수 인수 "마법"를 사용할 수 있습니다, 그렇지 않으면

def pr(text): 
    print(text) 

def frun(func, text): 
    func(text) 

frun(pr, "blah") 

을 :

def pr(text): 
    print(text) 

def frun(func, *args): 
    func(*args) 

frun(pr, "blah") 

후자를 훨씬 덜 읽을 수 있으며 이어질 수있는 당신은 단지 하나의 인자가있는 경우

답변

1

TL; DR :Partial Application

문제는 func의 인수를 평가하려는 범위로 전달하는 것으로 귀결됩니다. Ther e는 이것을 수행하는 몇 가지 방법입니다.

명시 매개 변수화

이 GET의 당신은 수많은 기능, 또는 깊은 함수 호출 나무가 있다면 다루기.

def pr(text): 
    print(text) 

def frun(func, *func_args): 
    func(*func_args) 

frun(pr, *pr_args) 

Deferred Execution with Lambda

제한 : 당신이 lambda을 만들 때, 동시에 사용할 수 func에 대한 모든 인수가 필요합니다.

Partial Application

def pr(text): 
    print(text) 

def frun(func): 
    func() 

frun(lambda: pr(*pr_args)) 

다음은 좋은 점은 개체의이 함께 통과 얻을 당신이 부분 응용 프로그램을 수행 할 수 있습니다. partial 명명 된 변수를 사용하는 경우 인수의 순서 문제를 제거합니다.

from functools import partial 

def pr(text): 
    print(text) 

def frun(func): 
    func() 

frun(partial(pr, *pr_args)) 
+0

부분은 좋은 것, 감사합니다. –

2

을 수행 할 수 있습니다 이상한 오류가 발생할 수 있습니다 (이 경우 pr에는 하나의 위치 인수 만 필요하므로 여러 매개 변수가 전달 된 경우에도 작동하지 않음). 예를 들어, 때 당신은 당신의 기능이 필요로 얼마나 많은 매개 변수 사전를 모르는 : 당신은 lambda 기능을 사용 할 수

def pr1(text): 
    print(text) 

def pr2(text, note): 
    print(text, note) 

def frun(func, *args): 
    func(*args) 

frun(pr1, "foobarbaz") 
frun(pr2, "blah", "IT WORKS!") 
+0

감사합니다. 그러나 답변은 핵심 논점에 좋지 않으며 일부는 작동하지 않습니다. –

0

코드를 변경하지 않고, frun 함수에 매개 변수와 함께 pr 기능을 전달합니다.

def pr(text): 
    print(text) 

# just another example to show how to pass more than one argument. 
def pr2(text, note): 
    print(text, note) 


def frun(func): 
    func() 


frun(lambda: pr('Hello')) 
frun(lambda: pr2('Hello', 'World')) 

Hello 
Hello World 

는 파라미터를 호출 한 후 callback 함수 로 frunfunc를 복귀하는 데 유용 할 수있는 다른 방법 :

def pr(text): 
    print(text) 

# just another example to show how to pass more than one argument. 
def pr2(text, note): 
    print(text, note) 


def frun(func): 
    # do some stuff 
    return func 


frun(pr)('Hello') 
frun(pr2)('Hello', 'World') 


Hello 
Hello World 
관련 문제