Я не знаю, является ли это цепочкой функций в той же степени, что и вызываемой цепочкой, но, поскольку функции являются вызываемыми, я думаю, что это не причинит вреда. В любом случае есть два способа сделать это:
Подклассификация intи определение __call__:
Первый способ - использовать собственный intподкласс, который определяет, __call__что возвращает новый экземпляр самого себя с обновленным значением:
class CustomInt(int):
def __call__(self, v):
return CustomInt(self + v)
Функция addтеперь может быть определена для возврата CustomIntэкземпляра, который, как вызываемые , который возвращает обновленное значение самого по себе, может быть вызван последовательно:
>>> def add(v):
... return CustomInt(v)
>>> add(1)
1
>>> add(1)(2)
3
>>> add(1)(2)(3)(44)
50
Кроме того, как intподкласс, возвращаемое значение сохраняет поведение __repr__и s. Однако для более сложных операций вам следует соответствующим образом определить другие dunders .__str__int
Как отметил @Caridorc в комментарии, это addможно также просто записать как:
add = CustomInt
Переименование класса в addвместо CustomIntтакже работает аналогично.
Определите закрытие, требуется дополнительный вызов для получения значения:
Единственный другой способ, который я могу придумать, - это вложенная функция, требующая дополнительного вызова пустого аргумента для возврата результата. Я не используюnonlocal и не выбираю прикрепление атрибутов к объектам функции, чтобы сделать его переносимым между Pythons:
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
Он постоянно возвращает себя ( _inner_adder), который, если задан a val, увеличивает его ( _inner_adder += val), а если нет, возвращает значение как есть. Как я уже упоминал, ()для возврата увеличенного значения требуется дополнительный вызов:
>>> add(1)(2)()
3
>>> add(1)(2)(3)()
6