2014-02-25 3 views
1

벡터 강에서 상류 경로를 재귀 적으로 식별하는 도구를 설계하고 있습니다. 누적 경로 비용이 사용자가 정의한 테스트를 통과하면 검색을자를 수 있기를 원합니다. 이것이 가능한지 확실하지 않습니다. 아래는 내가하고 싶은 물건의 종류의 예는 다음과 같습니다 Python의 가변 함수 호출

def test1(value): 
    if value > 1: return True 
    else: return False 

def test2(value): 
    if value % 4: return True 
    else: return False 

def main(test): 
    for i in range(20): 
     if SPECIFIEDTEST(i): 
      print i 
      break 

main(test1) 

내가 간부 알고있다()이 목적을 위해 사용하지만이 눈살을 찌푸리게되고 이해 될 수 있는가? 다른 함수에 함수를 전달하는 또 다른 좋은 방법이 있습니까?

+0

사용자 입력은 어디서 오는가? – tzaman

+0

함수는 파이썬에서 최고 수준의 엔티티입니다. 함수를 다른 함수에 전달하거나 함수에 로컬 변수를 바인딩하여 호출 할 수 있습니다. 그래서 혼란 스럽네요. 예를 들어'f = { 'test1': test1, 'test2': test2} [key]'같은 것을 찾고 있다는 뜻입니까? (그 후 f (i)가 원하는 함수를 호출한다.) – torek

+1

def test1 (value) : return value> 1' 등 실제 리터럴 인'True'와'False'를 사용할 필요는 거의 없다. – chepner

답변

4

은 필요하지 않습니다. 단순히 함수를 전달하십시오. main()

def test1(value): 
    if value > 1: return True 
    else: return False 

def test2(value): 
    if value % 4: return True 
    else: return False 

# using test1 as the default input value... 
def main(test = test1): 
    for i in range(20): 
     if test(i): 
      print i 
      break 

main(test1) 
# prints 2 

main(test2) 
# prints 1 
+1

포스터가 사용자 정의를 언급하고'exec'에 대해 묻습니다. 문자열 입력이 관련되어 있다고 가정합니다. 그래서 '사전'이 필요한 이유입니다. – tzaman

+0

죄송합니다, 이것은 정말 기본적인 질문이었습니다. 함수를 다른 함수에 직접 전달할 수 있는지 여부는 간단하지 않았습니다. 도와 주셔서 감사합니다. – triphook

+0

@tzaman 네 말이 맞아, 그건 좋은 가정이야. 문자열과 같은 사용자 입력의 경우 사전이 적합합니다. 어느 쪽이든 함수를 포함하는 변수는 여전히 전달됩니다. – sgarza62

4

당신은 실제 기능에 함수 이름을 매핑하는 사전을 만들고, 그것을 사용할 수 있습니다 : 함수는 다른 함수에 매개 변수로 전달 될 수있다 이에 대한 사전 구축

tests = {'test1': test1, 'test2': test2} 
if tests[specifiedtest](i): 
    ...