2017-03-20 1 views
0

함수 호출 체인이 있다고 가정합니다. 인수 하지 가변되었는지 확인하도록 한 함수에서 다른 정의 된 함수로 변경할 수없는 정수 인수를 전달하려고합니다. 내 실수는 뭐니?

def func1(pick, arg1, arg2): 
    if pick == 1: 
     do stuff with arg1 and arg2 
    elif pick == 2: 
     do other stuff with arg1 and arg2 
    return stuff that got done 

def func2(pick, arg1, arg2, arg3): 
    if pick == 1: 
     do stuff with arg1 and arg2 and arg3 
    elif pick == 2: 
     do other stuff with arg1 and arg2 and arg3 
    return stuff that got done 

def func3(pick, func2, arg3): 
    if pick == 1: 
     do stuff with funcs and arg3 
    elif pick == 2: 
     do other stuff with funcs and arg3 
    return stuff that done 
etc .. 

난 SCIPY quad (수치 적분)를 통해 다른 하나의 함수에서 인수를 전달할 수 있었다. 또한 한 함수에서 다른 함수로 args를 전달할 수 있었는데, arg0가 으로 바뀌는 SCIPY minimize (최적화)을 통해 전달할 수있었습니다. 내 문제는 하나의 기능에서 다른 기능으로 변경할 수없는 입력 pick을 전달하는 것입니다. 나는 위의 간단한 예에서 정의 된 각 함수의 첫 번째 라인으로 print(pick)을 배치했다, 그리고 만약 내가
callme = func3(2 , func2(pick = pick, args) , [6, 0.5]) 

등의 기능이 체인을 호출한다면 다음 내 코드는 결국라는 오류 메시지를 뱉어 것

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

하지만 먼저 할 것 같은 뭔가 :

1 
2 
1 
2 
2 # (from pick = 2 in func3) 
[6 0.5] 

방법/이런 일이며, 입력을 보낼 수 왜함수 호출 체인에서 한 함수에서 다른 함수로?

편집 : 내 생각에 픽스를 클래스 개체로 사용하거나 kwargs를 사용하거나 pick 요소를 단일 요소로 구성된 unpackable tuple로 전달할 것입니다. 그러나 이것이 정확한지 또는 이것을 구현하는 방법이 확실하지 않습니다. 이상하게도, 내가 모르는 작전은 callme = func3(pick.func2 , func2, [6, 0.5])처럼 간단합니다. 나는 pickglobal으로 선언하려고 시도했으나 이로 인해 매개 변수가 전역 인 것에 대한 오류 메시지가 나타납니다.

답변

0

모든 기능에서 입력으로 pick을 제거했지만 기능으로 변수로 남겨 둡니다. 다음 함수 체인 앞에 다음 코드를 배치하여 pick을 초기화합니다.

def selectdist(pick): 
    ## 1 for original representation 
    ## 2 for normal representation on semilog(x) axis 
    ## 3 for normal representation on linearly-spaced ln(x) axis 
    return int(pick) 

pickdist = selectdist(3) # choose 1 2 or 3 

함수 쇄 후 한 번 사용하여 함수를 실행 체인 재 초기화를 pick. 더 이상 함수 체인의 맨 위에서 아래쪽으로 전달되는 인수가 아니기 때문에 버그의 출처가 사라졌습니다.

관련 문제