[Python-ideas] Pre-conditions and post-conditions

Eric V. Smith eric at trueblade.com
Wed Aug 29 19:40:32 EDT 2018



On 8/29/2018 6:39 PM, Eric Fahlgren wrote:
> On Wed, Aug 29, 2018 at 3:07 PM Marko Ristin-Kaufmann 
> <marko.ristin at gmail.com <mailto:marko.ristin at gmail.com>> wrote:
> 
>     Could you please elaborate a bit? I don't see how the annotations
>     would make the contracts invoked on inheritance. Consider this
>     simple case:
> 
>     class A:
>     @icontract.pre(lambda x: x > 0)
>     def some_method(self, x: int)->None:
>     pass
> 
>     class B(A):
>     # Precondition should be inherited here.
>     def some_method(self, x: int) -> None:
>     pass
> 
>     You would still need to somehow decorate manually the overridden
>     methods even though you would not specify any new contracts, right?
>     Is there a mechanism in Python that I am not aware of that would
>     allow us to accomplish that?
> 
> 
> A metaclass does this pretty easily.  I have a thing I wrote years ago 
> called MIS (Multi-Inheritance Safety) that is used to ensure you don't 
> do anything stupid in our physics-modeling database.  The database is a 
> collection of ~200 Python classes/mixins all deriving madly from each 
> other to get various behaviors (Has mass? You'll need this.  Has 
> moments?  You'll need this.  Has physical extent, i.e., can be seen?  
> You'll need these...).

I think a metaclass is a non-starter. If one were used, it would 
preclude using contracts in any case where a metaclass were already 
used, or where one was needed in the future. I'm sure people will 
disagree with me on this.

But, I think a more productive line of thinking is: what could be added 
to the language that would let contracts be implementable, and could 
also be used for other things, too? Sort of like how PEP 487 adds 
customizability that has wide applicability.

Eric


More information about the Python-ideas mailing list