Bunun olup olmadığını bilmiyoruz işlev öyle olduğu kadar zincirleme çağrılabilir fonksiyonları beri zincirleme ama vardır Yaptığım hiçbir zarar gelmez sanırım callables. Her iki durumda da, bunu yapmanın iki yolu var:
Alt sınıflandırma intve tanımlama __call__:
İlk yol , güncellenmiş değerle kendisinin yeni bir örneğini döndüren özel bir intalt sınıftır __call__:
class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
İşlev addartık CustomInt, kendisinin güncellenmiş bir değerini döndüren bir çağrılabilir olarak arka arkaya çağrılabilen bir örnek döndürmek için tanımlanabilir :
>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44)
50
Ek olarak, bir int alt sınıf olarak, döndürülen değer s'nin __repr__ve __str__davranışını korur int. Daha karmaşık işlemler için, diğer kaçışları uygun şekilde tanımlamalısınız .
@Caridorc'un bir yorumda belirttiği gibi, addbasitçe şu şekilde de yazılabilir:
add = CustomInt
Sınıfı addyerine olarak yeniden adlandırmak CustomIntda benzer şekilde çalışır.
Bir kapanış tanımlayın, değer elde etmek için ekstra çağrı gerektirir:
Aklıma gelen tek yol, sonucu döndürmek için fazladan boş bir argüman çağrısı gerektiren iç içe geçmiş bir işlevi içerir. Ben değilim değil kullanaraknonlocal ve fonksiyon nesnelere özelliklerini eklemek için opt pitonlarına arasında taşınabilir hale getirmek için:
def add(v):
def _inner_adder(val=None):
"""
if val is None we return _inner_adder.v
else we increment and return ourselves
"""
if val is None:
return _inner_adder.v
_inner_adder.v += val
return _inner_adder
_inner_adder.v = v
return _inner_adder
Bu sürekli olarak kendisini ( _inner_adder) döndürür , eğer a valsağlanırsa onu artırır ( _inner_adder += val) ve değilse, değeri olduğu gibi döndürür. Bahsettiğim gibi, ()artan değeri döndürmek için ekstra bir çağrı gerektirir :
>>> add(1)(2)()
3
>>> add(1)(2)(3)()
6