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.

Requirements

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

Installation

$ pip install forwardable

Usage

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):
        self.bar = set()

foo = Foo()
foo.add(1) # Delegates to foo.bar.add()
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

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

    def __init__(self):
        self.bar = set()

assert len(Foo()) == 0

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

Plucking

from forwardable import forwardable

@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.

License

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.

Source Distribution

forwardable-0.4.1.tar.gz (5.1 kB view details)

Uploaded Source

File details

Details for the file forwardable-0.4.1.tar.gz.

File metadata

  • Download URL: forwardable-0.4.1.tar.gz
  • Upload date:
  • Size: 5.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for forwardable-0.4.1.tar.gz
Algorithm Hash digest
SHA256 e84abd6aed24b39659304b8765c57fecaec208d372ea287fdbe71409f11139ca
MD5 922af49a0a9e727ccf7f78b6c6c382c9
BLAKE2b-256 7401af9252495478b84ecb6a139b67df57da4e32da5670f33028396111a962c7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page