実際のパラメータとして - 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")
私はmyfun
をmyfun((a, b, c))
として定義できることを知っていますが、もちろんレガシーコードがあるかもしれません。ありがとう
myfun(*Tuple)
は正確にあなたが要求したことを行います。
副次的な問題:しないTuple
、list
、file
、set
などの組み込み型の名前を識別子として使用する - それはひどいやり方であり、期待していないときに戻ってきて噛み付くので、積極的に組み込みの名前を隠すことを避けるあなた自身の識別子を使って。
引数リストの一部を展開することもできます。
myfun(1, *("foo", "bar"))
Pythonチュートリアル セクション4.7.3と4.7.4を見てください。引数としてタプルを渡すことについて話しています。
Tupleを使用してシーケンスを渡すのではなく、名前付きパラメーターを使用する(そして辞書を渡す)ことも検討します。位置が直感的に理解できない場合や複数のパラメータがある場合は、位置引数を使用するのは悪い習慣です。
これが関数型プログラミング方法です。それは構文砂糖から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)