Skip to main content

MetaClass supporting fine grained control of object creationand initialization

Project description

metaframe

PyPi Version PyPi Monthly Donwloads License Travis-ci Build Status Documentation Status Pytghon versions

MetaClass infrastructure to intercept instance creation/initialization enabling modification of args/kwargs and instance.

Documentation

Read the full documentation at readthedocs.org:

Python 2/3 Support

  • Python 2.7

  • Python 3.2/3.3/3.4/3.5

  • It also works with pypy and pypy3

Installation

metaframe is self-contained with no external dependencies

From pypi:

pip install metaframe

From source:

  • Place the metaframe directory found in the sources inside your project

Features:

  • MetaFrame metaclass to apply to any object - With embedded staticmethod with_metaclass to enable inheritance

  • MetaFrameBase class from which classes can inherit

  • 3 hooks (classmethods)

    • _new_pre: called before object creation

    • _new_do: called for object creation

    • _init_pre: called after object creation / before object initialization

    • _init_do: called fo object initialization

    • _init_post: called after object initialization

Usage:

A quick example which filters None and arguments which do not convert to float from the kwargs before the object is created:

from metaframe import MetaFrame


class A(MetaFrame.as_metaclass(object)):

    @classmethod
    def _new_do(cls, *args, **kwargs):

        nkwargs = dict()
        for key, val in kwargs.items():

            # Remove any argument with a value of None
            if val is None:
                continue

            try:
                val = float(val)
            except:
                continue

            nkwargs[key] = val

        # The only nuisance being the cumbersome call to _new_do
        # super doesn't work
        obj, args, kwargs = cls.__class__._new_do(cls, *args, **nkwargs)
        return obj, args, kwargs

    def __init__(self, **kwargs):
        for key, val in kwargs.items():
            print('key, val, type', key, val, type(val))


a = A(p1=72, p2=None, p3='hello', p4=None, p5='72.5')


# Now with a subclassed MetaB from MetaFrame
# Here super can be applied to find the higher in the hierarchy _new_do

class MetaB(MetaFrame):

    def _new_do(cls, *args, **kwargs):

        nkwargs = dict()
        for key, val in kwargs.items():

            # Remove any argument with a value of None
            if val is None:
                continue

            try:
                val = float(val)
            except:
                continue

            nkwargs[key] = val

        # super can be called directly
        obj, args, kwargs = super(MetaB, cls)._new_do(*args, **nkwargs)
        return obj, args, kwargs


class B(MetaB.as_metaclass()):
    def __init__(self, **kwargs):
        for key, val in kwargs.items():
            print('key, val, type', key, val, type(val))


b = B(p1=27, p2=None, p3='olleh', p4=None, p5='5.27')

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

metaframe-1.0.1.zip (10.8 kB view details)

Uploaded Source

File details

Details for the file metaframe-1.0.1.zip.

File metadata

  • Download URL: metaframe-1.0.1.zip
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for metaframe-1.0.1.zip
Algorithm Hash digest
SHA256 336c564ad36e081eb1fef896683d13ae4af2c428cf0db08432e10b000840192b
MD5 b8148957beeee8537326ce340e692073
BLAKE2b-256 112cc2d55ddc1dc85d60a263d8f66552dbe117c4e332f5fa594bdd0fd4918bbc

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