<div dir="ltr">On Mon, 27 Aug 2018 at 11:39, Steven D'Aprano <<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Mon, Aug 27, 2018 at 09:24:20AM +0100, Ivan Levkivskyi wrote:<br>
> TBH, I think one of the main points of design by contract is that contracts<br>
> are verified statically.<br>
<br>
No, that's not correct. Contracts may be verified statically if the <br>
compiler is able to do so, but they are considered runtime checks. <br></blockquote><div><br></div><div>Considered by whom? By people who prefer `assert isinstance(x, int)` over `x: int`? :-)<br></div><div><br></div><div> Contract in 99% of cases is just another word for type (maybe a very complex type like `DAG[T] <: Graph[T]`).</div><div>Everything else, like `x >= y` is better expressed as an explicit assert with an assert message.</div><div>But again this is rather IMO, than any kind of definition.</div><div><br></div><div>There is only one use case I see now where a dedicated syntax would give a large readability gain:<br></div><div>something like `self.x >= self.y`. But on the other hand I think such situations are too rare to justify any _new_ syntax.<br></div><div><br></div><div>--</div><div>Ivan</div><div><br></div><div><br></div></div></div>