Python + pipes
Monday, 18 April 2011 03:29![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вот что значит гибкий язык.
Чтобы добавить в питон пайплайны, достаточно определить элементарный декоратор над iterables, переопределив в нем оператор "|". Взамен получаем просто-таки F#:
При этом исходный код этого катастрофически сложного нововведения занимает 7 строчек. Не считая библиотеки стандартных комбинаторов.
Вообще, если бы в питоне была статическая типизация, я бы из него до конца жизни не вылезал.
Чтобы добавить в питон пайплайны, достаточно определить элементарный декоратор над iterables, переопределив в нем оператор "|". Взамен получаем просто-таки F#:
[1,2,3,4] | where(lambda x: x<=2) | as_list
При этом исходный код этого катастрофически сложного нововведения занимает 7 строчек. Не считая библиотеки стандартных комбинаторов.
class Pipe:
def __init__(self, function):
self.function = function
def __ror__(self, other):
return self.function(other)
def __call__(self, *args, **kwargs):
return Pipe(lambda x: self.function(x, *args, **kwargs))
def __init__(self, function):
self.function = function
def __ror__(self, other):
return self.function(other)
def __call__(self, *args, **kwargs):
return Pipe(lambda x: self.function(x, *args, **kwargs))
Вообще, если бы в питоне была статическая типизация, я бы из него до конца жизни не вылезал.
no subject
Date: Monday, 18 April 2011 06:38 (UTC)no subject
Date: Monday, 18 April 2011 07:33 (UTC)no subject
Date: Thursday, 5 May 2011 12:26 (UTC)no subject
Date: Thursday, 5 May 2011 12:52 (UTC)no subject
Date: Monday, 18 April 2011 08:08 (UTC)class L(l: List[Int]) {
def |(f:(Int)=>Boolean): List[Int] = l.foldLeft(List.empty[Int])((l1,l2)=> if(f(l2)) l2::l1 else l1) reverse
}
implicit def someToL(l: List[Int]) = new A(l)
List(1,2,3,4) |(e => e<=2) # выводит List(1,2)