[PEAK] Re: Trellis: ctrl.pulse

Sergey Schetinin maluke at gmail.com
Wed Apr 15 17:32:31 EDT 2009

On Thu, Apr 16, 2009 at 00:17, P.J. Eby <pje at telecommunity.com> wrote:
> At 11:48 PM 4/15/2009 +0300, Sergey Schetinin wrote:
>> On Wed, Apr 15, 2009 at 23:43, P.J. Eby <pje at telecommunity.com> wrote:
>> > At 11:38 PM 4/15/2009 +0300, Sergey Schetinin wrote:
>> >>
>> >> On Wed, Apr 15, 2009 at 23:11, Sergey Schetinin <maluke at gmail.com>
>> >> wrote:
>> >> > Importing trellis from stm is ugly, and messes with lazy imports of
>> >> > trellis (as done by Importing), replacing pulse with a special cell
>> >> > doesn't seem to hard, see attached patch.
>> >>
>> >> Also, install_controller is unnecessary:
>> >
>> > install_controller() is an API function so that you can replace the
>> > controller, e.g. for testing or for applications with special needs.
>> Oh, I see, but given it populates the global namespace, if some other
>> module already did "from peak.events.trellis import *" things will
>> break.
> Yes.  So don't do that.  ;-)
>> Can it really be part of API?
> Technically, I haven't documented it yet.  But that was the original intent
> of having it there.  At the moment it's more of a semi-private hack.
>  However, it's why you'll almost never see me importing stuff from
> 'trellis', as opposed to using 'trellis.whatever'.

Maybe a better choice would be not to add those functions to __all__
then (ctrl as well)? That would make it OK to `import *` to get things
like Component and decorators. And on_undo and similar things would be
addressed as stm.ctrl.on_undo. Or trellis.py could import itself and
then the overridable globals would be accessed as trellis.on_undo as
well, but things wouldn't be as fragile to import *.

trellis = sys.modules['peak.events.trellis']

__all__ = [
    'Cell', 'Constant', 'make', 'todo', 'todos', 'modifier',
    'Component', 'repeat', 'poll', 'InputConflict',
    'Dict', 'List', 'Set', 'mark_dirty', 'ConstantMixin', 'Sensor', #'ctrl',
    'AbstractConnector', 'Connector',  'Effector', 'init_attrs',
    'attr', 'attrs', 'compute', 'maintain', 'perform', 'Performer', 'Pipe',

_stm_names = [
    'on_commit', 'on_undo', 'atomically', 'manage', 'savepoint',
    'rollback_to', 'schedule', 'cancel', 'lock', 'used', 'changed',
    'initialize', 'change_attr',

def install_controller(new_ctrl):
    global ctrl
    globals().update([(name, getattr(new_ctrl, name)) for name in _stm_names])
    stm.ctrl = ctrl = new_ctrl

install_controller(stm.Controller()) #stm.LocalController()

More information about the PEAK mailing list