<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
h2
        {mso-style-priority:9;
        mso-style-link:"Heading 2 Char";
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:18.0pt;
        font-family:"Times New Roman",serif;
        font-weight:bold;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.Heading2Char
        {mso-style-name:"Heading 2 Char";
        mso-style-priority:9;
        mso-style-link:"Heading 2";
        font-family:"Times New Roman",serif;
        font-weight:bold;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:316501667;
        mso-list-template-ids:1388844708;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:"Courier New";
        mso-bidi-font-family:"Times New Roman";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<h2><span style="font-size:11.0pt;font-weight:normal">Hi folks,<o:p></o:p></span></h2>
<h2><span style="font-size:11.0pt;font-weight:normal">I intend to add a runtime assertion feature in python. Before submitting a PEP, I am sending a draft to this mailing list to discuss whether it would make sense (above this message). I have actually been
 using it for the last 2 years and it has proven to be robust and has achieved its primary goal.<o:p></o:p></span></h2>
<h2><span style="font-size:11.0pt;font-weight:normal">Briefly, the idea is to add a new assert that can be switch on/off depending on some variable/mechanism at runtime. The whole point of this assert is that it should not bring any overhead when off, i.e.
 by avoiding evaluating the expression enclosed in the runtime assert. It thus relies on Python grammar.<o:p></o:p></span></h2>
<h2><span style="font-size:11.0pt;font-weight:normal">Thanks for your feedback.<o:p></o:p></span></h2>
<h2><span style="font-size:11.0pt;font-weight:normal">Eloi<o:p></o:p></span></h2>
<h2><span style="font-size:11.0pt"><o:p> </o:p></span></h2>
<h2><span style="font-size:11.0pt"><o:p> </o:p></span></h2>
<h2><span style="font-size:11.0pt"><o:p> </o:p></span></h2>
<h2><span style="font-size:11.0pt">Abstract<o:p></o:p></span></h2>
<p><span style="font-size:11.0pt">This PEP aims at offering a runtime assert functionnality, extending the compiletime assert already available.<o:p></o:p></span></p>
<h2><a name="user-content-rationale" id="user-content-rationale"></a><span style="font-size:11.0pt">Rationale<o:p></o:p></span></h2>
<p><span style="font-size:11.0pt">There is no runtime assert relying on python grammar available. For diagnostics and/or debugging reasons, it would be valuable to add such a feature.<o:p></o:p></span></p>
<p><span style="font-size:11.0pt">A runtime assert makes sense when extra checks would be needed in a production environment (where non-debug builds are used).<o:p></o:p></span></p>
<p><span style="font-size:11.0pt">By extending the current python grammar, it would be possible to limit the overhead induces by those runtime asserts when running in a non "assertive" mode (-ed). The idea here is to avoid evaluating the expression when runtime
 assertion is not active.<o:p></o:p></span></p>
<p><span style="font-size:11.0pt">A brief example why avoiding evaluating the expression is needed to avoid any overhead in case the runtime assert should be ignored.<o:p></o:p></span></p>
<p class="MsoNormal">::<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">runtime_assert( 999 in { i:None for i in range( 10000000 ) } )<o:p></o:p></p>
<h2><a name="user-content-usage" id="user-content-usage"></a><span style="font-size:11.0pt">Usage<o:p></o:p></span></h2>
<p class="MsoNormal">::<o:p></o:p></p>
<p style="margin-left:.5in"><span style="font-size:11.0pt">runtime_assert( expr )<o:p></o:p></span></p>
<p style="margin-left:.5in"><span style="font-size:11.0pt">#would result in if expr and runtime_assert_active:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in">print RuntimeAssertionError()<o:p></o:p></p>
<h2><a name="user-content-implementation-details" id="user-content-implementation-details"></a><span style="font-size:11.0pt">Implementation details<o:p></o:p></span></h2>
<p><span style="font-size:11.0pt">There is already an implementation available, robust enough for production. The implementation is mainly grammar based, and thus the parser and the grammar needs to be updated:<o:p></o:p></span></p>
<ul type="disc">
<li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/graminit.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/ast.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/symtable.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/compile.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/Python-ast.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Python/sysmodule.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Modules/parsermodule.c<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Include/Python-ast.h<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Include/graminit.h<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Include/pydebug.h<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Grammar/Grammar<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Parser/Python.asdl<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Lib/lib2to3/Grammar.txt<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Lib/compiler/ast.py<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Lib/compiler/pycodegen.py<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Lib/compiler/transformer.py<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Lib/symbol.py<o:p></o:p></span></li><li class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo1">
<span lang="FR-BE">Modules/parsermodule.c<o:p></o:p></span></li></ul>
<h2><a name="user-content-references" id="user-content-references"></a><span style="font-size:11.0pt">References<o:p></o:p></span></h2>
<table class="MsoNormalTable" border="0" cellspacing="3" cellpadding="0" id="user-content-id1">
<tbody>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><span lang="FR-BE">[1]<o:p></o:p></span></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">PEP 306, How to Change Python's Grammar (<span lang="FR-BE"><a href="http://www.python.org/dev/peps/pep-0306"><span lang="EN-US">http://www.python.org/dev/peps/pep-0306</span></a></span>)<o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
<h2><a name="user-content-copyright" id="user-content-copyright"></a><span style="font-size:11.0pt">Copyright<o:p></o:p></span></h2>
<p><span style="font-size:11.0pt">This document has been placed in the public domain.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>