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 구문을 사용할 수 있습니다.
그리고 공식 파이썬 튜토리얼에서.
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
'programing' 카테고리의 다른 글
명령행에서 TypeScript 코드의 구문 오류를 확인하는 방법은 무엇입니까? (0) | 2023.06.16 |
---|---|
"이 시스템에서 스크립트 실행이 사용되지 않도록 설정되어 있으므로 Firebase를 로드할 수 없습니다.", 윈도우즈의 VSCode (0) | 2023.06.16 |
의 크기와 문자의 혼동스러운 동작 (0) | 2023.06.16 |
웹 양식 내부에 부분 보기를 포함하는 방법 (0) | 2023.06.16 |
웹팩 4 모듈을 자스민이 멤버를 감시할 수 있도록 구성할 수 있습니까? (0) | 2023.06.11 |