py-notify

24. 1. 2012 11:46 (aktualizováno) Pavel Císař

Sledovat aktuální dění je časově náročné a vyčerpávající. Proto mám rád „agregátory“ ve všech podobách, a The Daily Python-URL patří spolu s weekly Python-URL! k mým nejoblíbenějším. Dnes jsem pomocí prvního z nich objevil zajímavý modul py-notify.

Pokud používáte GTK+, wxWindows nebo Qt, pak vám koncept signálů není nijak neznámý. V podstatě stejný systém signálů pro použití v Pythonu nabízí právě py-notify. Nejvíce se mi na něm ale líbí podmínky a proměnné, které zajišťují automatické zasílání signálu při změně hodnoty. Podmínky lze dokonce kombinovat do výrazů – složených podmínek, které fungují jako samostatné signály rozesílané pouze při změně hodnoty celého výrazu. Pro rychlé seznámení vřele doporučuji vydařený tutoriál, u kterého jsem se i zasmál.

Celý modul je navržen velmi elegantně, snadno a přehledně se používá a je samozřejmě rozšířitelný.

Sdílet

  • Související články na ostatních blozích

  • 16. 4. 2007 20:21

    mys elf (neregistrovaný)

    Super, už nějakou doby DPU nečtu, ale tohle vypadá zajímavě. Trošku mi v tom ale chybí (pokud jsem něco nepřehlédl) elegance signálů z Qt (myslím, že Gtk+ má podobný systém). Tedy že každá třída definuje 0-n signálů identifikovaných jménem a je možné se připojit pomocí metody connect. Ale dalo by se to celkem snadno implementovat.

    from notify.signal import Signal

    class NotifyObject(ob­ject):
    def __init__(self):
    self.__signals__ = {}
    self.register­Signals()

    def registerSignal­s(self):
    pass

    def registerSignal(sel­f, signalName, accumulator = None):
    self.__signal­s__[signalName] = Signal(accumulator)

    def connect(self, signalName, callable):
    self.__signal­s__[signalName]­.connect(calla­ble)

    def emit(self, signalName, *args):
    self.__signal­s__[signalName]­.emit(args)


    if (__name__ == '__main__'):
    class TestObject(No­tifyObject):
    def registerSignal­s(self):
    self.register­Signal('testSig­nal')
    t = TestObject()
    def printArgs(*args):
    print args
    t.connect('tes­tSignal', printArgs)
    t.emit('testSig­nal', 1, 2, 3.5, 'xxx')

  • 16. 4. 2007 20:27

    mys elf (neregistrovaný)

    BTW, jak se v tomhle blogu formatuje zdrojak v Pythonu? Provizorne nahrazuji mezery znakem ^

    from notify.signal import Signal

    class NotifyObject(ob­ject):
    ^^^^def __init__(self):
    ^^^^^^^^self.__sig­nals__ = {}
    ^^^^^^^^self.re­gisterSignals()

    ^^^^def registerSignal­s(self):
    ^^^^^^^^pass

    ^^^^def registerSignal(sel­f, signalName, accumulator = None):
    ^^^^^^^^ self.__signal­s__[signalName] = Signal(accumulator)

    ^^^^def connect(self, signalName, callable):
    ^^^^^^^^self.__sig­nals__[signal­Name].connect(ca­llable)

    ^^^^def emit(self, signalName, *args):
    ^^^^^^^^self.__sig­nals__[signal­Name].emit(ar­gs)


    if (__name__ == '__main__'):
    ^^^^class TestObject(No­tifyObject):
    ^^^^^^^^def registerSignal­s(self):
    ^^^^^^^^^^^^s­elf.registerSig­nal('testSignal')
    ^^^^t = TestObject()
    ^^^^def printArgs(*args):
    ^^^^^^^^print args
    ^^^^t.connect('tes­tSignal', printArgs)
    ^^^^t.emit('tes­tSignal', 1, 2, 3.5, 'xxx')