質問

2つのPython関数がありますが、どちらも関数定義で可変引数を取ります。簡単な例を示すには:

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

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

それらを作成したいのですが func1(func2(3, 4, 5)) - しかし、私は望んでいません argsfunc1 することが ([6, 7, 8],), 、私はそれを望んでいます (6, 7, 8), 、まるでそれがasと呼ばれたかのように func1(6, 7, 8) それよりも func1([6, 7, 8]).

通常、私はただ使用します func1(*func2(3, 4, 5)) または持っている func1 確認するかどうかを確認してください args[0] リストでした。残念ながら、この特定のインスタンスで最初のソリューションを使用することはできません。2番目のソリューションを適用するには、多くの場所でそのようなチェックを行う必要があります(の役割には多くの機能があります func1).

誰かがこれを行う方法を考えていますか?ある種の内省が使用できると思いますが、間違っている可能性があります。

役に立ちましたか?

解決

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)

他のヒント

最初の引数がリストであるかどうかをチェックする機能デコレータの作成を検討できます。既存の機能にデコレーターを適用することは、機能を変更するよりも少し簡単です。

通常、私はただ使用します func1(*func2(3, 4, 5)) または、func1をチェックして、かどうかを確認します args[0] でした list. 。残念ながら、この特定のインスタンスで最初のソリューションを使用することはできません。2番目のソリューションを適用するには、多くの場所でそのようなチェックを行う必要があります(の役割には多くの機能があります 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))) (しかし、あなたはする必要はありません)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top