Skip to main content

Forwardable as in Ruby's stdlib

Project description

Utility for easy object composition via delegation. Roughly ported from Ruby’s forwardable standard library.


Python 2.7 or 3.3 w/ standard library. Might work on other version of Python, too.


$ pip install forwardable


Most Common Use Case

The @forwardable.forwardable() decorator enables you to use def_delegator() and def_delegators() in a class definition block.

Use def_delegators() to define multiple attr forwarding:

from forwardable import forwardable

@forwardable() # Note the () here, which is required.
class Foo(object):
    def_delegators('bar', 'add, __len__')

    def __init__(self): = set()

foo = Foo()
foo.add(1) # Delegates to
assert len(foo) == 1 # Magic methods works, too

Easy, heh?

Define a Single Forwarding

In case you only need to delegate one method to a delegatee, just use def_delegator:

from forwardable import forwardable

class Foo(object):
    def_delegator('bar', '__len__')

    def __init__(self): = set()

assert len(Foo()) == 0

And it should work just fine. Actually, def_delegators() calls def_delegator() under the hood.


from forwardable import forwardable

class MyDict(object):
    def_delegator('dct.get', '__call__')
    def __init__(self):
        self.dct = {'foo', 42}

d = MyDict()
# Equivlant to d.dct.get('foo')
assert d('foo') == 42

Less Magical Usage

The @forwardable() decorator injects def_delegator{,s} into the module scope temorarily, which is why you don’t have to import them explicitly. This is admittedly magical but discourages the usage of import *. And it’s always nice to type less characters whenever unnecessary.

If you hesitate to utilize this injection magic, just explicitly say from forwardable import def_delegator, def_delegators, use them in a class definition and you’ll be fine.


MIT license.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for forwardable, version 0.4.1
Filename, size File type Python version Upload date Hashes
Filename, size forwardable-0.4.1.tar.gz (5.1 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page