<div>(Sorry about the formatting - I'm a former student of Annie's, who just joined the list.)</div><div><br></div><div>Jim Jewett wrote:</div><div> </div><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<span style="font-family:fixed-width,monospace;font-size:12px;background-color:rgb(255,255,255)">Even in this thread, there have been multiple posts that would shown <br></span><span style="font-family:fixed-width,monospace;font-size:12px;background-color:rgb(255,255,255)">bugs when the witness itself had a boolean evaluation of False. <br>

</span>What if any and all started to return a Witness object that evaluated <br>to True/False, but made the value available?  I could see an object <br>like this being useful in other code as well. <br>    class Witness(object): <br>

        def __bool__(self):  return self.truth <br>        def __init__(self, truth, value): <br>            self.truth=truth <br>            self.value=value <br>Of course, it might be nicer to inherit from type(True), and it still <br>

doesn't quite solve the laziness problem with for, or the <br>assign-in-the-right-place problem with while. </blockquote><div><br></div><div>I'm wondering if would make sense to add an "as" clause to the while and if statements, similar to the as clause in the with statement. It would essentially retrieve the value field from the witness object described above.</div>

<div><br></div><div>This would let one write the main loop in a topological sort (a classic workset algorithm) as:</div><div><br></div><div>    while any(v for v in vertices if v.incoming_count == 0) as v1:</div><div>        result.append(v)</div>

<div>        for v2 in v1.outgoing:</div><div>            v2.incoming_count -= 1</div><div><br></div><div>Another use of this could be for database queries that return 0 or 1 results:</div><div><br></div><div>    if db.query(page_name=page_name) as page:</div>

<div>        render_template(page)</div><div>    else:</div><div>        error404()</div><div><br></div><div>This is a common pattern that often involves either exception handling or a sentinel value like None.</div>