Size: a a a

2019 October 03

SA

Sergey Arkhipov in rannts
def recommended_books(books):
 book_names = [book.name for book in books]
 good_books = [name for name in book_names if name not in ("LALA", "BLABLA")]
 recommended = [find_similar(name) for name in good_books]

 return recommended
чот сложно. в функции есть действия. и каждое действие делает чот свое
источник

SA

Sergey Arkhipov in rannts
действия - слоты для трансформации данных!
источник

SA

Sergey Arkhipov in rannts
Как это может выглядеть в общем виде?
источник

SA

Sergey Arkhipov in rannts
def recommended_books(func1, func2, func3, books):
 book_names = func1(books)
 good_books = func2(book_names)
 recommended = func3(good_books)

 return recommended
но ведь это же некрасиво?
источник

SA

Sergey Arkhipov in rannts
давайте перепишем
источник

SA

Sergey Arkhipov in rannts
def megafunc(*funcs):
 def outer_decorator(f):
   @functools.wraps(f)
   def decorator(*args):
     res = None
     for fun in funcs:
       res = fun(res)
     return res

   return decorator
 return outer_decorator
во, теперь проще генерировать такие функции. смотрите какая красота!
источник

SA

Sergey Arkhipov in rannts
но не, опять строчки кода. а строчки - слоты
источник

SA

Sergey Arkhipov in rannts
можем ли мы что-то сделать с этим?
источник

SA

Sergey Arkhipov in rannts
def megafunc(*funcs):
 def outer_decorator(f):
   @functools.wraps(f)
   def decorator(*args):
     return functools.reduce(lambda acc, fun: fun(acc), funcs, None)

   return decorator
 return outer_decorator
во! одна строчка! синглебтареспонсибилити
источник

SA

Sergey Arkhipov in rannts
recommended_books = megafunc(
 lambda x: map(operator.attrgetter("name"), x),
 lambda x: filter(lambda n: n in {"LALA", "BLABLA"}, x),
 lambda x: itertools.chain(map(find_similar, x))
)
как же теперь жить стало заебись. посмотрите, какой у унас теперь компактный код стал. и если нам надо действие добавить, так как теперь просто стало его добавить!
источник

SA

Sergey Arkhipov in rannts
теперь если мы хотим порекомендовать из базы, просто берем и меняем одну строчку! а сколько строчек вы бы поменяли в оригинальном?
источник

БС

Байт Словович in rannts
Никита узнал про haskell?
источник

SA

Sergey Arkhipov in rannts
и логика выполнения отделена от бизнеслогики
источник

NK

Nick Kugaevsky in rannts
Sergey Arkhipov
recommended_books = megafunc(
 lambda x: map(operator.attrgetter("name"), x),
 lambda x: filter(lambda n: n in {"LALA", "BLABLA"}, x),
 lambda x: itertools.chain(map(find_similar, x))
)
как же теперь жить стало заебись. посмотрите, какой у унас теперь компактный код стал. и если нам надо действие добавить, так как теперь просто стало его добавить!
Функции каррировали каррировали, да не выкаррировали
источник

SA

Sergey Arkhipov in rannts
Между прочим, Коля, он говорит что вы, рубисты, так и пишете
источник

SA

Sergey Arkhipov in rannts
источник

SA

Sergey Arkhipov in rannts
типа вот так
источник

SA

Sergey Arkhipov in rannts
у моего кода есть недостаток: а что если мы хотим в одном месте поменять map на какой-нибудь parallel_map, нам же придется код менять везде?
источник

SA

Sergey Arkhipov in rannts
не беда!
источник

SA

Sergey Arkhipov in rannts
func_processor = megafunc(lambda x: x)
recommended_books = megafunc(
 megafunc(lambda x: func_processor(map)(func_processor(operator.attrgetter("name")), x)),
 megafunc(func_processor(filter)(lambda n: n in {"LALA", "BLABLA"}, x)),
 megafunc(lambda x: func_processor(itertools.chain)(func_processor(map)(func_processor(find_similar), x)))
)
источник