2010-04-05 3 views
3

두 개의 Python 함수가 있는데 둘 다 함수 정의에서 가변 인수를 사용합니다. 간단한 예제를 제공합니다 :* args로 파이썬 목록?

def func1(*args): 
    for arg in args: 
     print arg 

def func2(*args): 
    return [2 * arg for arg in args] 

내가 그들을 구성하고 싶습니다 - func1(func2(3, 4, 5)) 같이 -하지만 난 그것이 (6, 7, 8)가되고 싶어요, ([6, 7, 8],)을 수 func1args를 원하지 않는 것처럼 func1([6, 7, 8]) 대신 func1(6, 7, 8)이라고 불렀습니다.

일반적으로 func1(*func2(3, 4, 5))을 사용하거나 func1을 확인하여 args[0]이 목록인지 확인하십시오. 불행히도, 나는이 특별한 경우에 첫 번째 해결책을 사용할 수없고 두 번째를 적용하는 것은 많은 장소에서 그런 수표를 요구할 것입니다 (func1의 역할에 많은 기능이 있습니다).

아무도 아이디어를 가지고 있지 않습니까? 나는 일종의 내성이 사용될 수 있다고 상상하지만 잘못 될 수 있습니다.

+7

"'내가이 특정 instance'의 첫 번째 솔루션을 사용할 수 없습니다"왜 ? – interjay

+0

파이썬 함수를 호출하지만 문법에서 풀기를 지원하지 않는 파서를 사용하고 있습니다. – exupero

답변

3

야로 슬라브 (Yaroslav)가 게시 한 데코레이터를 사용할 수 있습니다.

최소 예 :

def unpack_args(func): 
    def deco_func(*args): 
     if isinstance(args, tuple): 
      args = args[0] 

     return func(*args) 

    return deco_func 


def func1(*args): 
    return args 

def func2(*args): 
    return args 

@unpack_args 
def func3(*args): 
    return args 

print func1(1,2,3) # > (1,2,3) 
print func2(1,2,3) # > (1,2,3) 
print func1(*func2(1,2,3)) # > (1,2,3) 
print func1(func2(1,2,3)) # > ((1,2,3),) 
print func3(func2(1,2,3)) # > (1,2,3) 
4

첫 번째 인수가 목록인지 확인하는 작성 함수 데코레이터를 고려해 볼 수 있습니다. 기존 함수에 데코레이터를 적용하는 것은 함수를 수정하는 것보다 약간 간단합니다.

1

일반적으로, 난 그냥 func1(*func2(3, 4, 5))를 사용하거나 args[0]list했다 있는지 확인 FUNC1 것이다. 불행히도, 나는이 특별한 경우에 첫 번째 해결책을 사용할 수없고 두 번째를 적용하는 것은 많은 장소에서 그런 수표를 요구할 것입니다 (func1의 역할에 많은 기능이 있습니다).

왜 첫 번째 해결책을 사용할 수 없습니까? 그게 가능하지 않으면

>>> def func1(*args): 
    for arg in args: 
     print arg 

>>> def func2(*args): 
    return [2 * arg for arg in args] 

>>> func2(3, 4, 5) 
[6, 8, 10] 
>>> func1(1,2,3) 
1 
2 
3 
>>> func1(*func2(3, 4, 5)) 
6 
8 
10 
>>> 

, 당신은 여전히 ​​func1(*tuple(func2(3, 4, 5)))을 사용할 수도 (하지만 당신은 할 필요가 없습니다).

+0

OP에는 튜플이나 목록뿐만 아니라 스칼라 값을 반환하는 함수가 있다고 생각합니다. 이들 모두를 공통 표준으로 변환하는 것은 너무 비싸다. – Yaroslav