*argsとしてのpythonリスト?
-
24-09-2019 - |
質問
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)
, 、まるでそれが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)))
(しかし、あなたはする必要はありません)。