[PEAK] trellis attrs

P.J. Eby pje at telecommunity.com
Fri Sep 30 17:14:39 EDT 2011

At 10:16 PM 9/30/2011 +0200, nicky van foreest 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=...)").

More information about the PEAK mailing list