[PEAK] DM refactoring and asynchrony (was Re: PEAK and Twisted, revisited)

Robert Brewer fumanchu at amor.org
Tue Jun 1 20:25:36 EDT 2004

Phillip J. Eby wrote:
> >f = logic.Expression(lambda x: x.Amount > 127)
> >trans = namespace.recall(Transaction, f)
> >The current downside is that I'm using CPython-specific
> >bytecode hacks both in the formation of the Expression object
> I'm not clear why you'd need bytecode hacks at all.  It seems 
> to me that 
> one could simply call the lambda expression with an object 
> designed for the 
> purpose, to extract its logic.  Indeed, if you don't mind 
> using &&, ||, and 
> ~  (for "and", "or", and "not" respectively), you don't even need the 
> lambda part.

Heh. I had an earlier version which did exactly that. The issues came
down to:

1) I really *did* mind using & and |, and
2) Since it operated on the "object designed for the purpose", the
syntax ended up looking like:
   a) A computed value, which then was never bound to a name (just
thrown away), or
   b) An assignment which didn't actually assign its referent.
   Both of them were too "unPythonic" for me to swallow... :)

Oh, and Dejavu caches the returned objects, so 3) you can pass those
fully-formed objects to the lambda and get evaluation without further
"logic extraction". That was probably the biggest "cool factor" at the
time I made the switch.

> I think my post may not have been clear here about what I was 
> seeking.  I 
> was looking for a Pythonic way to express schemas, more than a way to 
> express queries, although I'd like the syntax to be 
> consistent across both 
> queries and schema definition, since schemas involve rules that are 
> quantifiers over queries.  (E.g. this condition applies for 
> all X, or no X meets this criterion.)

Ah. Sorry, I joined the list after your initial post and was replying to
someone else's reply.

> > > The same thing in an FO
> > > approach would
> > > > correspond to a single fact type, pairing the two objects.
> > > So, there
> > > > would be only *one* implementation of that fact type, 
> handling both
> > > > sides of the relationship.
> >
> >As I describe above, I leave it to the DM to decide whether or not it
> >can optimize such relationships. The Python code is the master model.
> >FWIW, I have a namespace.associate() method, which adds 
> methods to both
> >the near and far classes to look up each other. For example, 
> to retrieve
> >all Ledger objects for a given Transaction, you write:
> >
> >for ledger in aTransaction.Ledger():
> >     ledger.do_something()
> Heh, if you think that's a slick way of doing it, you should 
> have a look at 
> the "Active Record" framework that's part of Ruby's "Rails" web 
> framework.  It's the most terse way of describing an object 
> schema I've 
> ever seen.  Hell, it *figures out whether an attribute name 
> is plural*, and 
> then takes the singular form to look up a type name!  That's 
> actually far 
> too much guesswork for my taste, but you sure can't beat the 
> brevity with 
> which one can describe the schema.  :)

I actually considered that (singular/plural approach) at one point. :)
But I figured that would inhibit users of the framework too much.

> >Of course, Dejavu isn't anywhere near the complexity of PEAK, or even
> >address the exact same domains (I make plenty of assumptions about my
> >data that PEAK can't), but it's interesting to discuss 
> similar problems
> >across models. I look forward to learning more about about 
> PEAK as time
> >permits.
> Yeah, PEAK is a bit hard to sum up in brief.  PEAK's entire 
> persistence 
> machinery and domain modelling aren't even part of its core; 
> they're just 
> one of its handy non-core frameworks.  And as you may have 
> seen from my 
> most recent post on this topic (re: removing ZODB4), you'll 
> see that those 
> parts are going to be changing quite a bit.
> At least peak.binding is relatively stable these days.  (He 
> says, crossing 
> his fingers for luck...)

Well, then, good luck!

Robert Brewer
Amor Ministries
fumanchu at amor.org

More information about the PEAK mailing list