2017-12-30 34 views
-3

나는 반드시 실행해야하는 함수로 튜플을 만들려고합니다. 내가 람다 함수를 declade파이썬 람다 함수 인수 문제

내 코드는 외모와 같은 : 나는 tuple1 및 tuple2를 사용

if opt in ("-u", "--usage"): 
    func = lambda x : MyCpu_Usage(x) 
    tuple1 += (func,) 
    tuple2 += (arg,) 
elif opt in ("-f", "--frequency"): 
    func = lambda x : MyCpu_freq(x) 
    tuple1 += (func,) 
    tuple2 += (arg,) 

그리고 코드 :

iter = 0 
for item in tuple1: 
    item(tuple2[iter]) 
    iter += 1 

문제이며, 그것을위한 함수 내 튜플 싸이클 (항목)이 인수를 허용하지 않으면 튜플 내에서 [iter]가 올바르게 설정됩니다. 답장을 보내 주셔서 감사합니다.

편집 : 코드를 업데이트했으며 내 질문에 : ** 항목 (tuple2 [iter])이 작동하지 않습니다? 함수는 호출하지만 인수는 없습니다. **

+5

'tuple1'과'tuple2'의 결과는 끝납니다. 또한 - 당신은 그와 같은 튜플을 사용하는 것이 이상합니다 - 그리고 그 전체 람다 - 당신은 단지'MyCpu_Usage'를 사용할 것입니다 - 정확히 당신이하려는 것은 무엇입니까? –

+0

@JonClements 코드와 질문을 업데이트했습니다. –

+0

이제 여러분은'argparse' 내장 라이브러리인데, 인수를 기반으로 호출 할 적절한 함수를 설정 한 다음 나머지 구문 분석 된 인수를 해당 함수에 전달합니다. –

답변

0

귀하의 질문은 약간 불완전합니다. 하지만 여러 함수 호출이 있고 모든 함수 호출이 정확히 하나의 매개 변수로 작동한다고 가정합니다. 이 경우

, 당신은 (더 쉽게 확장으로,리스트해야하는) 당신의 튜플을 압축 할 수 있습니다

n = -1 
for n, (func, arg) in enumerate(zip(tuple1, tuple2)): 
    func(arg) 
n += 1 # to get the same base as you – number of calls made 

그것은 더 실용적인 것, 그러나, 이미 포함되어 하나 개의 목록을 가지고 쌍을 만들 수 호출이 경우

calls = [] 
… 
func = lambda x : MyCpu_Usage(x) 
calls += [(func, arg)] 
# or just 
calls += [(MyCpu_Usage, arg)] 
… 
n = -1 
for n, (func, arg) in enumerate(calls): 
    func(arg) 
n += 1 # to get the same base as you – number of calls made 

calls이라는 목록의 모든 목록 항목이 호출되는 함수와 인수와 2 소자 튜플이다. 각 루프 실행에서 항목은 첫 번째 튜플 요소가있는 0 번째 튜플 요소를 호출하여 처리됩니다.

당신이 항목의 독립적 인 확인하려면, 당신은

calls = [] 
… 
calls += [lambda: MyCpu_Usage(arg)] # arg being the same you had before 
… 
n = -1 
for n, call in enumerate(calls): 
    call() 
n += 1 # to get the same base as you – number of calls made 

arg가,이 경우, 폐쇄 것을, 그러나주의 할 수 있습니다. 즉, 다시 지정하고 다시 사용하면 사용하는 모든 람다에 대해 변경됩니다. 이 경우 다음과 같이 할 수 있습니다 :

def new_lambda(target, *args, **kwargs): 
    return lambda: target(*args, **kwargs) 

calls = [] 
… 
calls += [new_lambda(MyCpu_Usage, arg)] 
… 
n = -1 
for n, call in enumerate(calls): 
    call() 
n += 1 # to get the same base as you – number of calls made