programing

python에서 인수 목록이 있는 함수 호출

telebox 2023. 6. 16. 21:40
반응형

python에서 인수 목록이 있는 함수 호출

파이썬에서 다른 함수 내부의 함수를 호출하려고 하는데 올바른 구문을 찾을 수 없습니다.제가 하고 싶은 일은 다음과 같습니다.

def wrapper(func, args):
    func(args)

def func1(x):
    print(x)

def func2(x, y, z):
    return x+y+z

wrapper(func1, [x])
wrapper(func2, [x, y, z])

이 경우 첫 번째 통화는 작동하고 두 번째 통화는 작동하지 않습니다.제가 수정하고 싶은 것은 호출된 함수가 아닌 래퍼 함수입니다.

다른 답변에 대해 조금 더 자세히 설명합니다.

줄에서:

def wrapper(func, *args):

args 즉, " 정된지나머매개변지수가를넣다다같습니목져록음에"라는 목록에 넣는 것을 의미합니다.args".

줄에서:

    func(*args)

args여기서 의미하는 것은 "args라는 이 목록을 나머지 매개 변수에 '랩 해제'하는 것입니다.

따라서 다음을 수행할 수 있습니다.

def wrapper1(func, *args): # with star
    func(*args)

def wrapper2(func, args): # without star
    func(*args)

def func2(x, y, z):
    print x+y+z

wrapper1(func2, 1, 2, 3)
wrapper2(func2, [1, 2, 3])

wrapper2명시적으로 되지만, 두 래퍼 에서 사용됩니다.args되어 있습니다.[1,2,3].

함수를 래핑하는 가장 간단한 방법

    func(*args, **kwargs)

내부에서 func()를 호출하는 래퍼를 수동으로 작성하는 것입니다.

    def wrapper(*args, **kwargs):
        # do something before
        try:
            return func(*a, **kwargs)
        finally:
            # do something after

Python에서 함수는 객체이므로 다른 함수의 인수로 이름을 전달하고 반환할 수 있습니다.또한 다음 함수에 대한 래퍼 생성기를 작성할 수 있습니다. Func():

    def wrapperGenerator(anyFunc, *args, **kwargs):
        def wrapper(*args, **kwargs):
            try:
                # do something before
                return anyFunc(*args, **kwargs)
            finally:
                #do something after
        return wrapper

또한 파이썬에서 함수의 모든 인수를 모르거나 이름을 지정하고 싶지 않을 때 함수 이름 뒤의 괄호 앞에 별표가 있는 인수 튜플을 참조할 수 있습니다.

    *args

예를 들어, 임의의 수의 인수를 사용하는 함수를 정의할 수 있습니다.

    def testFunc(*args):
        print args    # prints the tuple of arguments

Python은 함수 인수에 대한 추가 조작을 제공합니다.함수가 키워드 인수를 사용하도록 허용할 수 있습니다.함수 본문 내에서 키워드 인수는 사전에 보관됩니다.함수 이름 뒤의 괄호 안에 이 사전은 두 개의 별표와 사전 이름으로 표시됩니다.

    **kwargs

키워드 인수 사전을 인쇄하는 유사한 예제:

    def testFunc(**kwargs):
        print kwargs    # prints the dictionary of keyword arguments

당신의 질문에 대한 문자 그대로의 대답은 (당신이 요청한 것을 정확히 하기 위해, 함수나 함수 호출이 아닌 포장지만 변경하기 위해) 단순히 라인을 변경하는 것입니다.

func(args)

읽기 위해

func(*args)

주어진 (이 경우, 이은에 Python게주이목록가을말져합다니고라경우가것진어이(▁this,다말경▁given니우합in,args) 및 그 내용을 위치 인수로 함수에 전달합니다.

이 트릭은 함수 호출의 "양쪽"에서 작동하므로 다음과 같이 정의된 함수입니다.

def func2(*args):
    return sum(args)

당신이 던지는 만큼 많은 위치 인수를 받아들일 수 있을 것이고, 그것들을 모두 목록에 넣을 수 있을 것입니다.args.

이것이 상황을 조금 더 명확히 하는 데 도움이 되길 바랍니다.이 모든 것은 다음을 사용하여 dicts/keyword 인수로도 가능합니다.**대신에*.

변수 길이 인수에는 *args 및 **kwargs 구문을 사용할 수 있습니다.

*args와 **kwargs는 무엇을 의미합니까?

그리고 공식 파이썬 튜토리얼에서.

http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions

인수를 사용하여 압축을 풀어야 합니다.

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

def func1(x):
    print(x)

def func2(x, y, z):
    print x+y+z

wrapper(func1, 1)
wrapper(func2, 1, 2, 3)

이전 답변에 조금 더 추가하면, 문제에 대한 해결책을 찾을 수 없었기 때문에, 새로운 질문을 열 가치는 없지만, 저를 여기로 이끌었습니다.

다음은 다음과 같은 작은 코드 조각입니다.lists,zip()그리고.*args알 수 없는 양의 인수로 알 수 없는 양의 함수를 처리할 수 있는 래퍼를 제공합니다.

def f1(var1, var2, var3):
    print(var1+var2+var3)

def f2(var1, var2):
    print(var1*var2)

def f3():
    print('f3, empty')

def wrapper(a,b, func_list, arg_list):
    print(a)
    for f,var in zip(func_list,arg_list):
        f(*var)
    print(b)

f_list = [f1, f2, f3]
a_list = [[1,2,3], [4,5], []]

wrapper('begin', 'end', f_list, a_list)

명심하세요.zip()에서는 길이가 동일하지 않은 목록에 대한 안전 검사를 제공하지 않습니다. python에서 길이가 동일하다고 주장하는 zip 반복자를 참조하십시오.

언급URL : https://stackoverflow.com/questions/817087/call-a-function-with-argument-list-in-python

반응형