3

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))たいargsのですfunc1が、ではなく、のように呼び出されるように([6, 7, 8],)したいのです。(6, 7, 8)func1(6, 7, 8)func1([6, 7, 8])

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

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

4

3 に答える 3

4

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

于 2010-04-05T21:27:50.417 に答える
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)
于 2010-04-06T02:18:53.613 に答える
1

通常、私は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)))です (ただし、使用する必要はありません)。

于 2010-04-05T21:28:12.320 に答える