<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Oct 16, 2011, at 12:16 AM, Nick Coghlan wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; ">The current draft of PEP 3150 is available on<span class="Apple-converted-space"> </span><a href="http://python.org/">python.org</a>:<br><a href="http://www.python.org/dev/peps/pep-3150/">http://www.python.org/dev/peps/pep-3150/</a></span></blockquote></div><br><div>FWIW, I think the word "declarative" is being misused.</div><div>In the context of programming languages, "declarative"</div><div>is usually contrasted to "imperative" -- describing</div><div>what you want done versus specifying how to do it.</div><div><a href="http://en.wikipedia.org/wiki/Declarative_programming">http://en.wikipedia.org/wiki/Declarative_programming</a></div><div>I think what you probably meant to describe was something</div><div>akin to top-down programming</div><div><a href="http://en.wikipedia.org/wiki/Top–down_and_bottom–up_design#Top.E2.80.93down_approach">http://en.wikipedia.org/wiki/Top%E2%80%93down_and_bottom%E2%80%93up_design#Top.E2.80.93down_approach</a></div><div>using forward declarations:  <a href="http://en.wikipedia.org/wiki/Forward_declaration">http://en.wikipedia.org/wiki/Forward_declaration</a> .</div><div><br></div><div>Looking at the substance of the proposal, I'm concerned that style gets in the way of fluid code development.</div><div><br></div><div>Using the PEPs example as a starting point:</div><div><pre class="literal-block" style="padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; font-size: 14px; background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; position: static; z-index: auto; ">sorted_data = sorted(data, key=sort_key) given:
    def sort_key(item):
        return item.attr1, item.attr2</pre><div>What if I then wanted to use itertools.groupby with the same key function?</div></div><div>I would first have to undo the given-clause.</div><div><br></div><div>AFAICT, anything in the given statement block becomes hard to re-use</div><div>or to apply to more than one statement.  My guess is that code written</div><div>using "given" would frequently have to be undone to allow code re-use.</div><div><br></div><div>Also, it looks like there is a typo in the attrgetter example (the "v." is wrong).</div><div>It should read:</div><div><br></div><div>   sorted_list = sorted(original, key=attrgetter('attr1', 'attr2')</div><div><br></div><div>When used with real field names, that is perfectly readable:</div><div><br></div><div>   sorted(employees, key=attrgetter('lastname', 'firstname')</div><div><br></div><div>That isn't much harder on the eyes than:</div><div><br></div><div>   SELECT * FROM employees ORDER BY lastname, firstname;</div><div><br></div><div><br></div><div>Raymond</div></body></html>