/home/lnzliplg/public_html/newmetaclasses.zip
PK �\e@�P� � Eiffel.pynu �[��� """Support Eiffel-style preconditions and postconditions."""
from types import FunctionType as function
class EiffelBaseMetaClass(type):
def __new__(meta, name, bases, dict):
meta.convert_methods(dict)
return super(EiffelBaseMetaClass, meta).__new__(meta, name, bases,
dict)
@classmethod
def convert_methods(cls, dict):
"""Replace functions in dict with EiffelMethod wrappers.
The dict is modified in place.
If a method ends in _pre or _post, it is removed from the dict
regardless of whether there is a corresponding method.
"""
# find methods with pre or post conditions
methods = []
for k, v in dict.iteritems():
if k.endswith('_pre') or k.endswith('_post'):
assert isinstance(v, function)
elif isinstance(v, function):
methods.append(k)
for m in methods:
pre = dict.get("%s_pre" % m)
post = dict.get("%s_post" % m)
if pre or post:
dict[m] = cls.make_eiffel_method(dict[m], pre, post)
class EiffelMetaClass1(EiffelBaseMetaClass):
# an implementation of the "eiffel" meta class that uses nested functions
@staticmethod
def make_eiffel_method(func, pre, post):
def method(self, *args, **kwargs):
if pre:
pre(self, *args, **kwargs)
x = func(self, *args, **kwargs)
if post:
post(self, x, *args, **kwargs)
return x
if func.__doc__:
method.__doc__ = func.__doc__
return method
class EiffelMethodWrapper:
def __init__(self, inst, descr):
self._inst = inst
self._descr = descr
def __call__(self, *args, **kwargs):
return self._descr.callmethod(self._inst, args, kwargs)
class EiffelDescriptor(object):
def __init__(self, func, pre, post):
self._func = func
self._pre = pre
self._post = post
self.__name__ = func.__name__
self.__doc__ = func.__doc__
def __get__(self, obj, cls):
return EiffelMethodWrapper(obj, self)
def callmethod(self, inst, args, kwargs):
if self._pre:
self._pre(inst, *args, **kwargs)
x = self._func(inst, *args, **kwargs)
if self._post:
self._post(inst, x, *args, **kwargs)
return x
class EiffelMetaClass2(EiffelBaseMetaClass):
# an implementation of the "eiffel" meta class that uses descriptors
make_eiffel_method = EiffelDescriptor
def _test(metaclass):
class Eiffel:
__metaclass__ = metaclass
class Test(Eiffel):
def m(self, arg):
"""Make it a little larger"""
return arg + 1
def m2(self, arg):
"""Make it a little larger"""
return arg + 1
def m2_pre(self, arg):
assert arg > 0
def m2_post(self, result, arg):
assert result > arg
class Sub(Test):
def m2(self, arg):
return arg**2
def m2_post(self, Result, arg):
super(Sub, self).m2_post(Result, arg)
assert Result < 100
t = Test()
t.m(1)
t.m2(1)
try:
t.m2(0)
except AssertionError:
pass
else:
assert False
s = Sub()
try:
s.m2(1)
except AssertionError:
pass # result == arg
else:
assert False
try:
s.m2(10)
except AssertionError:
pass # result == 100
else:
assert False
s.m2(5)
if __name__ == "__main__":
_test(EiffelMetaClass1)
_test(EiffelMetaClass2)
PK �\a�Q�� �
Eiffel.pyonu �[��� �
��^c @ s� d Z d d l m Z d e f d � � YZ d e f d � � YZ d d d � � YZ d e f d
� � YZ d e f d � � YZ
d
� Z e d k r� e e � e e
� n d S( s6 Support Eiffel-style preconditions and postconditions.i����( t FunctionTypet EiffelBaseMetaClassc B s e Z d � Z e d � � Z RS( c C s, | j | � t t | � j | | | | � S( N( t convert_methodst superR t __new__( t metat namet basest dict( ( s2 /usr/lib64/python2.7/Demo/newmetaclasses/Eiffel.pyR s
c C s� g } xZ | j � D]L \ } } | j d � s_ | j d � r@ q t | t � r | j | � q q Wx` | D]X } | j d | � } | j d | � } | s� | rj | j | | | | � | | <qj qj Wd S( s� Replace functions in dict with EiffelMethod wrappers.
The dict is modified in place.
If a method ends in _pre or _post, it is removed from the dict
regardless of whether there is a corresponding method.
t _pret _posts %s_pres %s_postN( t iteritemst endswitht
isinstancet functiont appendt gett make_eiffel_method( t clsR t methodst kt vt mt pret post( ( s2 /usr/lib64/python2.7/Demo/newmetaclasses/Eiffel.pyR s
( t __name__t
__module__R t classmethodR ( ( ( s2 /usr/lib64/python2.7/Demo/newmetaclasses/Eiffel.pyR s t EiffelMetaClass1c B s e Z e d � � Z RS( c s1 � � � f d � } � j r- � j | _ n | S( Nc sK � r � | | | � n � | | | � } � rG � | | | | � n | S( N( ( t selft argst kwargst x( t funcR R ( s2 /usr/lib64/python2.7/Demo/newmetaclasses/Eiffel.pyt method'