metaframe
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')
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
336c564ad36e081eb1fef896683d13ae4af2c428cf0db08432e10b000840192b
|
|
| MD5 |
b8148957beeee8537326ce340e692073
|
|
| BLAKE2b-256 |
112cc2d55ddc1dc85d60a263d8f66552dbe117c4e332f5fa594bdd0fd4918bbc
|