MOON
Server: Apache/2.2.34 (Unix) mod_ssl/2.2.34 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4 FrontPage/5.0.2.2635
System: Linux server.asjudinet.com 2.6.32-042stab141.3 #1 SMP Fri Nov 15 22:45:34 MSK 2019 i686
User: asjudine (504)
PHP: 5.2.17
Disabled: NONE
Upload Files
File: //usr/local/ssl/local/ssl/lib/python2.4/Demo/metaclasses/Eiffel.pyc
mò
‚=5Dc@s˜dZdklZlZlZdefd„ƒYZdefd„ƒYZdefd„ƒYZedfhƒZd	„Z	e
d
joe	ƒndS(sÐSupport Eiffel-style preconditions and postconditions.

For example,

class C:
    def m1(self, arg):
        require arg > 0
        return whatever
        ensure Result > arg

can be written (clumsily, I agree) as:

class C(Eiffel):
    def m1(self, arg):
        return whatever
    def m1_pre(self, arg):
        assert arg > 0
    def m1_post(self, Result, arg):
        assert Result > arg

Pre- and post-conditions for a method, being implemented as methods
themselves, are inherited independently from the method.  This gives
much of the same effect of Eiffel, where pre- and post-conditions are
inherited when a method is overridden by a derived class.  However,
when a derived class in Python needs to extend a pre- or
post-condition, it must manually merge the base class' pre- or
post-condition with that defined in the derived class', for example:

class D(C):
    def m1(self, arg):
        return arg**2
    def m1_post(self, Result, arg):
        C.m1_post(self, Result, arg)
        assert Result < 100

This gives derived classes more freedom but also more responsibility
than in Eiffel, where the compiler automatically takes care of this.

In Eiffel, pre-conditions combine using contravariance, meaning a
derived class can only make a pre-condition weaker; in Python, this is
up to the derived class.  For example, a derived class that takes away
the requirement that arg > 0 could write:

    def m1_pre(self, arg):
        pass

but one could equally write a derived class that makes a stronger
requirement:

    def m1_pre(self, arg):
        require arg > 50

It would be easy to modify the classes shown here so that pre- and
post-conditions can be disabled (separately, on a per-class basis).

A different design would have the pre- or post-condition testing
functions return true for success and false for failure.  This would
make it possible to implement automatic combination of inherited
and new pre-/post-conditions.  All this is left as an exercise to the
reader.

(s	MetaClasss
MetaHelpersMetaMethodWrappertEiffelMethodWrappercBstZd„Zd„ZRS(NcCsti|||ƒyt||idƒ|_Wntj
od|_nXyt||idƒ|_
Wntj
od|_
nXdS(Nt_pret_post(tMetaMethodWrappert__init__tselftfunctinsttgetattrt__name__tpretAttributeErrortNonetpost(RRR((t-/usr/lib/python2.4/Demo/metaclasses/Eiffel.pyRDscOsl|iot|i||ƒnt|i|if||ƒ}|iot|i|f||ƒn|S(N(	RR
tapplytargstkwRRtResultR
(RRRR((Rt__call__Ss

(R	t
__module__RR(((RRBs	tEiffelHelpercBstZeZRS(N(R	RRt__methodwrapper__(((RR[stEiffelMetaClasscBstZeZRS(N(R	RRt
__helper__(((RR^stEiffelcCs0dtfd„ƒY}|ƒ}|idƒdS(NtCcBs#tZd„Zd„Zd„ZRS(NcCs|dS(Ni(targ(RR((Rtm1fscCs|djp
td‚dS(Nisprecondition for m1 failed(RtAssertionError(RR((Rtm1_prehscCs||jpt‚dS(N(RRR(RRR((Rtm1_postjs(R	RRRR(((RRes		i(RRtxR(R R((Rt_testds	t__main__N(t__doc__tMetat	MetaClasst
MetaHelperRRRRRR!R	(RR!RRR&RR%R((Rt?>s