2011/3/11 MRAB <span dir="ltr"><<a href="mailto:python@mrabarnett.plus.com">python@mrabarnett.plus.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im"><br>
</div>
Talking about different semantics, I had an (admittedly vague) idea<br>
about passing the body of a def statement to a builder as a string at<br>
runtime, allowing 'foreign' code to be embedded more easily.<br>
<br>
In a statement of the form:<br>
<br>
    def name(...) from builder:<br>
        ...<br>
<br>
the body of the def wouldn't be parsed by Python at compile time, but<br>
would, as I said, be passed to the builder as a string at runtime. The<br>
builder would be able to parse the string, compiling it to a callable<br>
object with hooks into Python so that it could access variables, call<br>
functions, etc, when it was actually executed.<br>
<br>
For example, this:<br>
<br>
    c.execute("""insert into stocks values (?, ?, ?, ?, ?)""", ('2006-01-05', 'BUY', 'RHAT',100, 35.14))<br>
<br>
could become (assuming that sqlite3 had a magic __compile__ function):<br>
<br>
    def insert(date, trans, symbol, qty, price) from sqlite3:<br>
        insert into stocks values (date, trans, symbol, qty, price)<br>
<br>
    insert('2006-01-05', 'BUY', 'RHAT',100, 35.14)<br>
<br>
When run, the SQL code would fetch the values of the parameters as<br>
needed.<br>
<br>
Actually, a closer match to the original code would be:<br>
<br>
    c.insert('2006-01-05', 'BUY', 'RHAT',100, 35.14)<br>
<br>
Clearly it's a method, so the instance would be passed as 'self',<br>
something like this:<br>
<br>
    def insert(self, date, trans, symbol, qty, price) from sqlite3:<br>
        insert into stocks values (date, trans, symbol, qty, price)<br>
<br>
but what happens to 'self' within the definition? It's not referred to<br>
in the SQL statement itself.</blockquote><div><br></div><div>I already do something like this:<br></div><div><br></div><div>DB.stocks += '2006-01-05', 'BUY', 'RHAT',100, 35.14</div><div><br></div>
<div>DB.stocks -= ID == 123</div><div><br></div><div>DB.stocks[ID == 123] = qty == qty + 1, price == 46.51</div><div><br></div><div>print DB.stocks[date, 'COUNT(*)'].GroupBy[date].OrderBy[date].Where[date['2011-01-01' : '2011-02-28']].List()</div>
<div><br></div><div>with Python 2.5+.</div><div><br></div><div>So there's no need for a new syntax to implement such things in a "pythonic" way.</div><div><br></div><div>However some changes can improve ORM-like code. For example, len() always checks that __len__ returns an integer, but "relaxing" it can help a bit(actually I revert to something like this: symbol.len()).</div>
<div><br></div><div>Cesare</div>