[PEAK] trellis attrs

PJ Eby pje at telecommunity.com
Fri Sep 30 17:17:42 EDT 2011

On Fri, Sep 30, 2011 at 4:16 PM, nicky van foreest <vanforeest at gmail.com>wrote:

> Sorry to bug you, but I tried also the following:
> class Step(trellis.Component):
>    duration = trellis.attr(0)
>    def __init__(self, machine):
>        self.machine = machine
>        self.prevs = trellis.Set([])
> instead of
> class Step(trellis.Component):
>     prevs = trellis.make(trellis.Set)
>    duration = trellis.attr(0)
>     def __init__(self, machine):
>        self.machine = machine
> This also works (that is, I get the same schedule in both cases). Is
> there a difference between the two implementations?

The reason that your code currently *appears* to work is because you're not
changing the value of 'prevs' at runtime.

If at some point you did, say, "someStep.prevs = trellis.Set(somedata)",
your program would break because none of the listeners of someStep.prevs
would notice the change.  That's why you should always declare your
attributes using trellis.* descriptors.

The more "correct" (trellisthonic?) way to write your code above is:

class Step(trellis.Component):
    duration = trellis.attr(0)
    prevs = trellis.make(trellis.Set)
    machine = None
    # No __init__ method necessary!

That is, there's no reason to have an __init__ method at all, since
trellis.Component() already takes keyword arguments and assigns them to
attributes, as long as they are defined in the class.

> The second
> implementation sets prevs as a class variable, but this does not
> appear necessary (telling from implementation 1).

Please note that 'prevs' is *not* a "class variable".  It's a descriptor.
That is, Step.prevs is a descriptor object, but someStep.prevs (where
someStep is an instance of Step) will be a distinct trellis.Set() instance,
unless overridden when created (e.g. via "someStep=Step(prevs=...)").
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.eby-sarna.com/pipermail/peak/attachments/20110930/1b5ad8a4/attachment-0001.html

More information about the PEAK mailing list