darts.util.events是一個Python庫,它提供了一個簡單的事件調度,類似由C#語言提供的事件結構 圖書館有沒有外部的依賴關係。
它的目的是為使用的情況下,其中的各個部件發射事件和監聽事件的組件同意關於事件的類型和與其相關的語義。這是真實的,例如,對於事件的處理程序,偵聽“點擊”圖形界面的按鈕對象,或者通過物體信號通知信號事件,每當一些屬性的值更改。這不同於所採取,比方說的辦法,PyDispatcher,這是更通用的,並有利於弱耦合組件之間的通信。
兼容性
該代碼的編寫和使用Python 2.6進行測試。它應該是兼容的,以2.5為好,但你可能要插入一些從這裡和那裡進口__future__線with_statement。它應該工作(這還沒有經過測試)與Python像Jython或IronPython的替代實現。但是請注意,一些在這個文件中定義的測試案例可能會因不同的垃圾收集實現失敗;該文件是寫的CPython的記在心裡。
文檔STRONG>
基本用法
 從>>>進口darts.lib.utils.event出版社,ReferenceRetention為RR
  >>> some_event =出版商()
發布的主要成分。它作為註冊表回調/監聽器。讓我們定義一個監聽器
  >>>高清打印機(* event_args,** event_keys):
  ...打印event_args,event_keys
為了接收通知,客戶端必須訂閱出版商。這可以是簡單的
  >>> some_event.subscribe(打印機)#doctest +省略號
 
呼叫訂閱的結果是(一些亞類的)類認購一個實例。該值可以在以後使用,以取消訂閱,當通知是不再需要的。實際的子類是一個實現細節,你通常應該不會在意。所有你需要知道的(並允許依靠,其實)是,這將是認購類的一個實例,它會提供力所能及已被記錄作為類的公共API(現在:唯一方法取消) 。
現在,讓我們信號的事件,看看會發生什麼:
  >>> some_event.publish(“一個事件”)
 ('一個事件“,){}
正如你所看到的,打印機已通知該事件,並duefully打印它的參數到控制台。
取消訂閱
如所提到的,在調用訂閱的結果是一個特殊的訂閱對象,表示與出版商聽者的註冊。
  >>> S1 = some_event.subscribe(打印機)
  >>> some_event.publish(“另一個事件')
 ('另一個事件',){}
 ('另一個事件',){}
  >>> s1.cancel()
 真
  >>> some_event.publish('尚未另外一')
 ('尚未另外一',){}
發布者是完全可重入。這意味著,你可以從一個偵聽器內訂閱事件,你可以取消這方面的訂閱,以及:
  >>>高清make_canceller(替補):
  ... DEF監聽器(* unused_1,** unused_2):
  ...打印“取消”,潛艇,subs.cancel()
  ...回報聽眾
  >>> S1 = some_event.subscribe(打印機)
  >>> S2 = some_event.subscribe(make_canceller(S1))
  >>> some_event.publish('得去“的)#doctest:+省略號
 ('得去“的,){}
 ('得去“的,){}
 取消
  >>> some_event.publish('水漲船高')#doctest:+省略號
 ('走了',){}
 取消
  >>> s1.cancel()
 假
呼叫取消的結果告訴我們,認購已經先於呼叫(通過我們的魔法消除聽眾)撤消。一般來說,呼籲取消多次是無害的;所有,但第一個電話被忽略。
現在讓我們去掉魔法我可任意取消-東西監聽器,並繼續前進:
  >>> s2.cancel()
 真
使用非可調用回調為
每當我們上面所做的訂閱,我們其實簡單求的東西一點點。該方法的完整簽名是:
  DEF訂閱(監聽[,方法[,reference_retention]])
讓我們先看看方法參數。到現在為止,我們只用函數對象作為聽眾。基本上,事實上,我們可能使用任何可調用的對象。請記住,任何物體是“可贖回”在Python,如果它提供了一個__call__方法,因此猜測,有什麼方法參數的默認值?
  >>> S1 = some_event.subscribe(打印機,方法='__ call__“)
  >>> some_event.publish('富')
 ('富',){}
 ('富',){}
  >>> s1.cancel()
 真
新鮮事。所以,現在你可能會問:什麼時候使用不同的方法叫什麼名字?
  >>>類目標(對象):
  ... DEF __init __(個體經營,名):
  ... self.name =名稱
  ... DEF _callback(個體經營,*的args,**鍵):
  ...打印self.name,ARGS,鑰匙
  >>> S1 = some_event.subscribe(目標('富'))
  >>> some_event.publish('!Bumm')#doctest:+省略號
 回溯(最新最後調用):
  ...
 類型錯誤:“目標”對象是不可調用
哎呀。讓我們刪除的罪犯,之前有人注意到我們的錯誤:
  >>> s1.cancel()
 真
  >>> S1 = some_event.subscribe(目標('富'),方法='_回調“)
  >>> some_event.publish('工程!“)
 ('!工程',){}
 富(的作品!'){}
參考保留
所以,就是這樣。還有一個未開發的參數來預訂離開,雖然:reference_retention。這個名字聽起來很危險的,但它有什麼作用?
  >>>監聽=目標('美味')
  >>> S2 = some_event.subscribe(監聽器,方法='_回調',reference_retention = RR.WEAK)
  >>> some_event.publish(“佑”)
 ('佑',){}
 富('佑',){}
 美味('佑',){}
嗯。到目前為止,沒有任何差別。讓我們做一個簡單的變化:
  >>>監聽器=無
  >>> some_event.publish(“佑”)
 ('佑',){}
 富('佑',){}
啊。好不好。我們的美味聽眾不見了。發生了什麼事?好了,通過指定弱參考保留策略,我們告訴出版商,它應該使用而不是默認的強引用一個弱引用剛剛安裝的監聽器。之後,我們通過設置監聽器無公佈的唯一已知的強引用聽眾,聽眾竟是從出版商刪除。請注意,順便說一句,那上面的例子可以比其他CPython的Python實現失敗,由於不同的政策相對於垃圾收集。原則應保持有效,不過,在Jython中以及IronPython的,但在那些實施方式中,也不能保證,即聽者只要最後一個引用它被丟棄除去。
當然,這一切工作過,如果要調用的方法是默認的:__call__:
  >>>高清make_listener(名):
  ... DEF監聽器(*的args,**鍵):
  ...打印名稱args鑰匙
  ...回報聽眾
  >>>監聽= make_listener(“弱”)
  >>> S2 = some_event.subscribe(監聽器,reference_retention = RR.WEAK)
  >>> some_event.publish(“事件”)
 ('事件',){}
 富('事件',){}
 弱('事件',){}
  >>>監聽器=無
  >>> some_event.publish(“事件”)
 ('事件',){}
 富('事件',){}
這是對所有有了解的庫。正如我上面所說的:這是簡單,可能不適合所有scenarioes和使用情況下是有用的,但它做什麼,它被寫入。
錯誤處理
Publisher類不打算被繼承。如果您需要定制的行為,您使用策略對象/回調,這是傳遞給構造。現在,有一個單一的政策調整,即,如果發布者的行為,聽眾拋出異常:
  >>>高清toobad(事件):
  ......如果事件=='養':
  ...提高ValueError錯誤
  >>> S1 = some_event.subscribe(toobad)
  >>> some_event.publish('無害')
 ('無害',){}
 富('無害',){}
  >>> some_event.publish('升高')
 回溯(最新最後調用):
  ...
  ValueError錯誤
正如你所看到的,默認的行為是重新引發異常從內部發布。這可能不足以根據使用情況。尤其是,它會阻止以後註冊要運行的任何偵聽器。那麼,讓我們來定義自己的錯誤處理:
  >>>高清LOG_ERROR(例外,價值,追踪,認購,ARGS,鍵):
  ...打印“中招”,異常
  >>>出版商=出版商(exception_handler = LOG_ERROR)
  >>> publisher.subscribe(toobad)#doctest:+省略號
 
  >>> publisher.subscribe(打印機)#doctest +省略號
 
  >>> publisher.publish('無害')
 ('無害',){}
  >>> publisher.publish('升高')
&NBSP;抓<類型'exceptions.ValueError'>
&NBSP;('養',){}
作為替代,以提供在施工時間的錯誤處理程序,您還可以發布一個事件的時候,像這樣提供一個錯誤處理程序:
&NBSP; >>>高清log_error_2(例外,價值,追踪,認購,ARGS,鍵):
&NBSP; ......“在出版”打印“中招”,異常,
&NBSP; >>> publisher.publish_safely(log_error_2,'養')
&NBSP;抓<類型'exceptions.ValueError'>出版期間
&NBSP;('養',){}
正如你所看到的,每次通話的錯誤處理程序優先於出版商的默認錯誤處理程序。請注意,沒有鏈接,也就是說,如果每次通話的錯誤處理程序引發了異常,出版商的默認處理程序不叫,但異常簡單的傳播向外的publish_safely來電:出版商有沒有辦法來區分由於提出的處理程序要中止調度和異常意外引發的異常,因此受到處理程序提出的所有異常都只是轉發給客戶端應用程序。
線程安全
該庫是完全意識到線程和線程安全的。因此,訂閱多個線程共享一個監聽器是安全的,所以被取消訂閱
什麼在此版本中是新的:
- 現在,認購處理提供訪問他們的監聽對象和方法名。這是增加的緣故錯誤處理代碼,它想記錄異常,並提供鑑定的實際監聽器,其中又以流氓一個更好的方式。
什麼版本0.2是新的:
- 在錯誤處理已被更改。相反,繼承出版商,默認的異常處理程序現已通過回調來施工期間發布。該類出版商現在記錄為&QUOT;不適用於被子類和QUOT;
要求:
- 在Python的
評論沒有發現