Python + pipes

Monday, 18 April 2011 03:29
skiminok: (xkcd)
[personal profile] skiminok
Вот что значит гибкий язык.

Чтобы добавить в питон пайплайны, достаточно определить элементарный декоратор над 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))


Вообще, если бы в питоне была статическая типизация, я бы из него до конца жизни не вылезал.

Date: Monday, 18 April 2011 06:38 (UTC)
From: [identity profile] thedeemon.livejournal.com
In Ruby:
class Array
  def |(f) f.call(self) end
end

def where(&f)
  lambda {|a| a.find_all(&f)}
end

p [1,2,3,4] | where{|x| x<=2}         # выводит [1,2]

Date: Monday, 18 April 2011 07:33 (UTC)
From: [identity profile] ignir.livejournal.com
Плюсую статическую типизацию.

Date: Thursday, 5 May 2011 12:52 (UTC)
From: [identity profile] ignir.livejournal.com
Действительно. Надо попробовать, посмотреть какие грабли там лежат, кроме того, что Cython не всё умеет.

Date: Monday, 18 April 2011 08:08 (UTC)
From: [identity profile] dvig-al.livejournal.com
Статическая типизация, недолго думая, но.
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)

Profile

skiminok: (Default)
skiminok

Most Popular Tags

July 2011

S M T W T F S
     12
3456789
10111213141516
17181920212223
242526272829 30
31