Композиция функций Python

Я попытался реализовать композицию функций с хорошим синтаксисом, и вот то, что я имею:

from functools import partial

class _compfunc(partial):
    def __lshift__(self, y):
        f = lambda *args, **kwargs: self.func(y(*args, **kwargs)) 
        return _compfunc(f)

    def __rshift__(self, y):
        f = lambda *args, **kwargs: y(self.func(*args, **kwargs)) 
        return _compfunc(f)

def composable(f):
    return _compfunc(f)

@composable    
def f1(x):
    return x * 2

@composable
def f2(x):
    return  x + 3

@composable
def f3(x):
    return (-1) * x

print f1(2) #4
print f2(2) #5
print (f1 << f2 << f1)(2) #14
print (f3 >> f2)(2) #1
print (f2 >> f3)(2) #-5

Это хорошо работает с целыми числами, но перестало работать в списках/кортежах:

@composable
def f4(a):
    a.append(0)

print f4([1, 2]) #None

Где ошибка?

9
задан si14 17 February 2010 в 09:26
поделиться

1 ответ

append выполняет добавление на месте, как сказал Игнасио Васкес-Абрамс (ну, подразумевается) -- поэтому, хотя вы можете исправить это, просто добавив return к вашей функции, это будет иметь побочный эффект изменения переданного ей аргумента:

@composable
def f4(a):
    a.append(0)
    return a

Лучше использовать следующий, еще более лаконичный код, который также создает и возвращает новый объект:

@composable
def f4(a):
  return a + [0]
9
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: