Skip to main content
Help us improve PyPI by participating in user testing. All experience levels needed!

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

Release history Release notifications

This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download files

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

Filename, size & hash SHA256 hash help File type Python version Upload date
forwardable-0.4.1.tar.gz (5.1 kB) Copy SHA256 hash SHA256 Source None May 17, 2016

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page