Honeyman (honeyman) wrote,

Околомонадное

Признайтесь, вы ведь всегда хотели композицию функций в Python-е?
#!/usr/bin/python2.6

from itertools import izip_longest, imap
from functools import partial
import operator, sys

class Compose(object):
    __slots__ = ("func",)

    def __init__(self, func = None):
        self.func = func

    def bind(self, next_func):
        return Compose(next_func) if self.func is None \
                                  else Compose(lambda *args, **kwargs: next_func(self.func(*args, **kwargs)))

    def __rshift__(self, next_func):
        if isinstance(next_func, tuple):
            return self.bind(partial(*next_func))
        elif callable(next_func):
            return self.bind(next_func)

    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

compose = Compose()


И вот как, например, этим можно пользоваться:
izip_fillwith0 = partial(izip_longest, fillvalue = "\x00")
convert_string_to_byte_list = partial(imap, ord)
xor_values = partial(reduce, operator.xor)

xor_strings = compose >> \
              (apply, izip_fillwith0) >> \
              (imap, convert_string_to_byte_list) >> \
              (imap, xor_values) >> \
              (imap, chr) >> \
              "".join

ARG = ("abcdef", "ABCDEF", "5678900")
sys.stdout.write(xor_strings(ARG))
Tags: python
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments

_nik_

May 13 2010, 06:23:27 UTC 4 years ago

Такое впечатление, что тебе тесновато в питонячих рамках и ты бы давно начал работать на каком хаскелоподобии, если бы на это дело тут был спрос.

honeyman

May 13 2010, 08:53:45 UTC 4 years ago

Я бы давно стал работать на том же Хаскеле, если бы я его банально знал (я подозреваю, спрос бы где-нибудь нашёлся). От незнания приходится писать программы на Хаскеле на Питоне.

9000

June 16 2010, 19:43:36 UTC 4 years ago

Да где тут хаскель, тут и ML-я хватит, мне кажется :)
Вот когда напишется собственный lazy evaluator (каких достаточно во всяких либах, например, в SQLAlchemy) и монады (тут не знаю), то... %))