web-dev-qa-db-ja.com

タップを数に展開する

実際のパラメータとして - Python Tupleを関数に拡張する方法はありますか?

例えば、ここでexpand()は魔法をします:

Tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(Tuple)) # (2, "foobar", "barfoo")

私はmyfunmyfun((a, b, c))として定義できることを知っていますが、もちろんレガシーコードがあるかもしれません。ありがとう

337
AkiRoss

myfun(*Tuple)正確にあなたが要求したことを行います。

副次的な問題:しないTuplelistfilesetなどの組み込み型の名前を識別子として使用する - それはひどいやり方であり、期待していないときに戻ってきて噛み付くので、積極的に組み込みの名前を隠すことを避けるあなた自身の識別子を使って。

624
Alex Martelli

引数リストの一部を展開することもできます。

myfun(1, *("foo", "bar"))
37
Valentas

Pythonチュートリアル セクション4.7.3と4.7.4を見てください。引数としてタプルを渡すことについて話しています。

Tupleを使用してシーケンスを渡すのではなく、名前付きパラメーターを使用する(そして辞書を渡す)ことも検討します。位置が直感的に理解できない場合や複数のパラメータがある場合は、位置引数を使用するのは悪い習慣です。

14
Uri

これが関数型プログラミング方法です。それは構文砂糖からTuple拡張機能を持ち上げます:

apply_Tuple = lambda f, t: f(*t)

使用例

from toolz import * 
from operator import add, eq

apply_Tuple = curry(apply_Tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_Tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

カレーapply_Tupleの再定義は、長期的に見てpartialの呼び出しを大幅に節約します。

私は同様の問題に遭遇し、固定機能を拡張するこの機能を作成しました。お役に立てれば。

def run_argtup(func, argvalues):
    """
    Execute any functions with their arguments in Tuple.

    :param func:
    :param argvalues:
    :return:
    """
    argnames = get_func_argnames(func)
    if len(argnames) != len(argvalues):
        raise ValueError("Length of args doens't match.")
    for argn, argv in Zip(argnames, argvalues):
        exec('{}=argv'.format(argn))
    return eval('func(%s, %s)' % argnames)
0
Gabriel_F