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: //proc/3/root/proc/2/task/2/root/usr/lib/python2.4/Demo/metaclasses/Eiffel.pyo
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((Rtm1fscCsdS(N((RR((Rtm1_prehscCsdS(N((RRR((Rtm1_postjs(R	RRRR(((RRes		i(RRtxR(RR((Rt_testds	t__main__N(t__doc__tMetat	MetaClasst
MetaHelperRRRRRR R	(RR RRR%RR$R((Rt?>s