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ý.
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(object):
def __init__(self):
self.__signals__ = {}
self.registerSignals()
def registerSignals(self):
pass
def registerSignal(self, signalName, accumulator = None):
self.__signals__[signalName] = Signal(accumulator)
def connect(self, signalName, callable):
self.__signals__[signalName].connect(callable)
def emit(self, signalName, *args):
self.__signals__[signalName].emit(args)
if (__name__ == '__main__'):
class TestObject(NotifyObject):
def registerSignals(self):
self.registerSignal('testSignal')
t = TestObject()
def printArgs(*args):
print args
t.connect('testSignal', printArgs)
t.emit('testSignal', 1, 2, 3.5, 'xxx')
BTW, jak se v tomhle blogu formatuje zdrojak v Pythonu? Provizorne nahrazuji mezery znakem ^
from notify.signal import Signal
class NotifyObject(object):
^^^^def __init__(self):
^^^^^^^^self.__signals__ = {}
^^^^^^^^self.registerSignals()
^^^^def registerSignals(self):
^^^^^^^^pass
^^^^def registerSignal(self, signalName, accumulator = None):
^^^^^^^^ self.__signals__[signalName] = Signal(accumulator)
^^^^def connect(self, signalName, callable):
^^^^^^^^self.__signals__[signalName].connect(callable)
^^^^def emit(self, signalName, *args):
^^^^^^^^self.__signals__[signalName].emit(args)
if (__name__ == '__main__'):
^^^^class TestObject(NotifyObject):
^^^^^^^^def registerSignals(self):
^^^^^^^^^^^^self.registerSignal('testSignal')
^^^^t = TestObject()
^^^^def printArgs(*args):
^^^^^^^^print args
^^^^t.connect('testSignal', printArgs)
^^^^t.emit('testSignal', 1, 2, 3.5, 'xxx')
*22.6.1968
Od mala mě fascinoval potenciál počítačů a od prvního osobního seznámení s nimi jsem věděl, že tahle „věcička“ je přesně tím, čím se chci zabývat celý život. Hned po maturitě jsem si našel práci, kde jsem s nimi mohl pracovat a hlavně učit se. V průběhu let jsem vystřídal řadu zaměstnavatelů a specializací (např. ekonomické systémy, implementace BIOSu pro CP/M, řízení tech. procesů) až jsem nakonec na dlouhá léta zakotvil u Delphi a databází (hlavně InterBase), nejdříve ve firmě PCS, pak AKTIS (nyní ABRA) a posléze Borland ČR. Od uvolnění zdrojových textů InterBase v r. 2000 a zrodu projektu Firebird se podílím na jeho vývoji (nyní hlavně jako QA manager). Od r. 2001 pracuji pro spol. IBPhoenix. Mým preferovaným programovacím jazykem je již dlouhá léta Python.
Přečteno 18 038×
Přečteno 17 184×
Přečteno 8 708×
Přečteno 8 630×
Přečteno 6 786×