私はpartial
のようなものを再実装しようとしました(後でより多くの動作があります)。次の例では、lazycall1
はlazycall2
と同じくらいうまく動作しているようですので、私はdocumentation of partial
が長い第2バージョンを使用している理由を理解できません。助言がありますか?それは私を困らせることができますか?Pythonのクロージャと関数の属性
def lazycall1(func, *args, **kwargs):
def f():
func(*args, **kwargs)
return f
def lazycall2(func, *args, **kwargs):
def f():
func(*args, **kwargs)
f.func=func # why do I need that?
f.args=args
f.kwargs=kwargs
return f
def A(x):
print("A", x)
def B(x):
print("B", x)
a1=lazycall1(A, 1)
b1=lazycall1(B, 2)
a1()
b1()
a2=lazycall2(A, 3)
b2=lazycall2(B, 4)
a2()
b2()
編集:実際にはこれまでの回答はあまり正しくありません。二重引数でもうまくいくでしょう。別の理由はありますか?
def lazycall(func, *args):
def f(*args2):
return func(*(args+args2))
return f
def sum_up(a, b):
return a+b
plusone=lazycall(sum_up, 1)
plustwo=lazycall(sum_up, 2)
print(plusone(6)) #7
print(plustwo(9)) #11
これは違いはありません。私はより一般的な例で私の質問を編集しました。あれは正しいですか? – Gerenuk
'functools.partial'によって返されるオブジェクトは、' .func'、 '.keywords'および' .func'属性を持ちます。ドキュメントは純粋なpythonでそれをエミュレートする方法を示しています。しかし、いいえ、返されたオブジェクトの*呼び出し*には影響しません。返されたオブジェクトで最初に渡された関数とargsにアクセスできるようにします。 – AdamKG
OK、そうです。もちろんそうです。 – Gerenuk