문제

함수를 호출하고 매개 변수를 전달하는 방법을 알고 싶습니다. 그렇지 않을 수 있습니다 기대하십시오.

나는 며칠 전에이 문제에 직면하여 그 주위에 길을 찾았습니다. 그러나 오늘, 나는 내가하고 싶은 것이 가능했는지 알기로 결정했습니다. 불행히도, 나는 내가 그것을 사용했던 맥락을 기억하지 못한다. 그래서 여기에는 이것을하는 더 좋은 방법이 많이있는 바보 같은 예가 있지만, 그냥 무시한다.

def test(func, arg1, arg2):
    return func(arg1, arg2, flag1=True, flag2=False) #Only pass the flags if the function accepts them.

def func1(a, b, flag1, flag2):
    ret = a
    if flag1:
        ret *= b
    if flag2:
        ret += b
    return ret

def func2(a, b):
    return a*b

print test(func1, 5, 6) #prints 30

내가 생각해 낸 대안은 다음과 같이 보였습니다.

def test(func, arg1, arg2):
    numArgs = len(inspect.getargspec(func).args)
    if numArgs >= 4:
        return func(arg1, arg2, True, False)
    elif numArgs == 3:
        return func(arg1, arg2, True)
    else:
        return func(arg1, arg2)

print test(func2, 5, 6) #prints 30

또는 시도 .. 제외 .. 블록

그러나 FUNC1과 FUNC2를 변경하지 않고이 작업을 수행하는 더 나은 방법이 있어야합니다.

(편집하다): Max S에서 제공하는 솔루션을 사용하면 이것이 최선의 방법이라고 생각합니다.

def callWithOptionalArgs(func, *args):
    argSpec = inspect.getargspec(func)
    lenArgSpec = len(argSpec.args or ())
    argsToPass = args[:lenArgSpec] #too many args
    defaults = argSpec.defaults or ()
    lenDefaults = len(defaults)
    argsToPass += (None, )*(lenArgSpec-len(argsToPass)-lenDefaults) #too few args
    argsToPass += defaults[len(argsToPass)+len(defaults)-lenArgSpec:] #default args

    return func(*argsToPass)
print callWithOptionalArgs(func1, 5, 6, True) #prints 30
print callWithOptionalArgs(func2, 5, 6, True) #prints 30
도움이 되었습니까?

해결책

기능을 검사하는 것은 원본을 변경하거나 장식하지 않고 다른 수의 인수를 가진 함수를 명시 적으로 구별하는 유일한 방법입니다. 내가 당신의 포장지에 대한 유일한 변화는 여러 가지 논쟁에 대해 일반화하는 것입니다.

def padArgsWithTrue(func, *args):
    passed_args = list(args)
    num_args = len(inspect.getargspec(func).args)
    passed_args += [True] * (num_args - len(args))
    return func(*passed_args)

print padArgsWithTrue(lambda x,y,z,w: (x*y, z, w), 5, 6)

편집하다: 이것은 변수의 Args 또는 키워드 Args를 가진 함수를 수용하지 않습니다. 완전한 해결책을 작성하기 전에 사람들을 다루기 위해 정책을 결정해야합니다.

다른 팁

내가 당신을 이해한다면, 당신은 테스트를 사용하여 func1과 func2를 모두 호출 할 수 있기를 원합니다.

def test(func, arg1, arg2):
    try:
        return func(arg1, arg2, flag1=True, flag2=False)
    except TypeError:
        return func(arg1, arg2)


def func1(a, b, flag1, flag2):
    ret = a
    if flag1:
        ret *= b
    if flag2:
        ret += b
    return ret

def func2(a, b):
    return a*b

print test(func1, 5, 6) #prints 30
print test(func2, 5, 6) #prints 30
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top