Building CPython

Marko Rauhamaa marko at pacujo.net
Sat May 16 18:51:08 EDT 2015


Marko Rauhamaa <marko at pacujo.net>:

> Ok, here's a quick port that have barely tried out:

And here's a more complete port (with some possible dunder abuse):

========================================================================
### Simple OO Framework

class _O: pass

def make_object(*procedures, base=None, bases=None):
    o = _O()
    methods = {}
    o.__methods__ = methods
    o.__derived__ = None
    if base is not None:
        _inherit_single(o, base)
    elif bases is not None:
        _inherit_multi(o, bases)
    for procedure in procedures:
        methods[procedure.__name__] = procedure
        def method(*args, __procedure__=procedure, __dispatch__=True, **kwargs):
            if not __dispatch__ or o.__derived__ is None:
                return __procedure__(*args, **kwargs)
            derived = o
            while derived.__derived__ is not None:
                derived = derived.__derived__
            return getattr(derived, __procedure__.__name__)(*args, **kwargs)
        setattr(o, procedure.__name__, method)
    return o

def _inherit_single(o, base):
    methods = o.__methods__
    for name, method in base.__methods__.items():
        methods[name] = method
        setattr(o, name, method)

def _inherit_multi(o, bases):
    for base in bases:
        _inherit_single(o, base)

def delegate(method, *args, **kwargs):
    return method(*args, __dispatch__=False, **kwargs)

### Used as follows

def TCPClient():
    def connect(address):
        pass
    def shut_down():
        pass
    return make_object(connect, shut_down)

def SMTPClient():
    tcp_client = TCPClient()
    def connect(address):
        delegate(tcp_client.connect, address)
        do_stuff()
    def send_message(message):
        pass
    return make_object(connect, send_message, base=tcp_client)

client = SMTPClient()
client.connect(None)
========================================================================


Marko



More information about the Python-list mailing list