[Checkins] SVN: zope.interface/trunk/src/zope/interface/ Added
russian translation for adapter.txt
Dmitry Vasiliev
dima at hlabs.spb.ru
Sun Jun 24 13:10:09 EDT 2007
Log message for revision 77009:
Added russian translation for adapter.txt
Changed:
A zope.interface/trunk/src/zope/interface/adapter.ru.txt
U zope.interface/trunk/src/zope/interface/adapter.txt
U zope.interface/trunk/src/zope/interface/tests/test_adapter.py
-=-
Added: zope.interface/trunk/src/zope/interface/adapter.ru.txt
===================================================================
--- zope.interface/trunk/src/zope/interface/adapter.ru.txt (rev 0)
+++ zope.interface/trunk/src/zope/interface/adapter.ru.txt 2007-06-24 17:10:08 UTC (rev 77009)
@@ -0,0 +1,544 @@
+================
+РееÑÑÑ Ð°Ð´Ð°Ð¿ÑеÑов
+================
+
+.. contents::
+
+РееÑÑÑÑ Ð°Ð´Ð°Ð¿ÑеÑов пÑедоÑÑавлÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð´Ð»Ñ ÑегиÑÑÑаÑии обÑекÑов коÑоÑÑе
+завиÑÑÑ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¹, или неÑколÑкиÑ
ÑпеÑиÑикаÑий инÑеÑÑейÑов и пÑедоÑÑавлÑÑÑ
+(возможно не напÑÑмÑÑ) какой-либо инÑеÑÑейÑ. Рдополнение, ÑегиÑÑÑаÑии имеÑÑ
+имена. (Ðожно дÑмаÑÑ Ð¾Ð± именаÑ
как о ÑпеÑиÑикаÑоÑаÑ
пÑедоÑÑавлÑемого
+инÑеÑÑейÑа.)
+
+ТеÑмин "ÑпеÑиÑикаÑÐ¸Ñ Ð¸Ð½ÑеÑÑейÑа" ÑÑÑлаеÑÑÑ Ð¸ на инÑеÑÑейÑÑ Ð¸ на опÑеделениÑ
+инÑеÑÑейÑов, Ñакие как опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑов ÑеализованнÑÑ
каким-либо
+клаÑÑом.
+
+ÐдиноÑнÑе адапÑеÑÑ
+==================
+
+ÐавайÑе ÑаÑÑмоÑÑим пÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÑÑий единÑÑвеннÑÑ ÑÑебÑемÑÑ
+ÑпеÑиÑикаÑиÑ::
+
+ >>> from zope.interface.adapter import AdapterRegistry
+ >>> import zope.interface
+
+ >>> class IR1(zope.interface.Interface):
+ ... pass
+ >>> class IP1(zope.interface.Interface):
+ ... pass
+ >>> class IP2(IP1):
+ ... pass
+
+ >>> registry = AdapterRegistry()
+
+ÐÑ Ð·Ð°ÑегиÑÑÑиÑÑем обÑÐµÐºÑ ÐºÐ¾ÑоÑÑй завиÑÐ¸Ñ Ð¾Ñ IR1 и "пÑедоÑÑавлÑеÑ" IP2::
+
+ >>> registry.register([IR1], IP2, '', 12)
+
+ÐоÑле ÑегиÑÑÑаÑии Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ запÑоÑиÑÑ Ð¾Ð±ÑÐµÐºÑ Ñнова::
+
+ >>> registry.lookup([IR1], IP2, '')
+ 12
+
+ÐамеÑÑÑе, ÑÑо Ð¼Ñ Ð¸ÑполÑзÑем Ñелое в ÑÑом пÑимеÑе. Ð ÑеалÑнÑÑ
пÑиложениÑÑ
вÑ
+можеÑе иÑполÑзоваÑÑ Ð¾Ð±ÑекÑÑ ÐºÐ¾ÑоÑÑе на Ñамом деле завиÑÑÑ Ð¸Ð»Ð¸ пÑедоÑÑавлÑÑÑ
+инÑеÑÑейÑÑ. РееÑÑÑ Ð½Ðµ забоÑиÑÑÑÑ Ð¾ Ñом, ÑÑо ÑегиÑÑÑиÑÑеÑÑÑ Ð¸ Ñаким обÑазом мÑ
+можем иÑполÑзоваÑÑ ÑелÑе, или ÑÑÑоки ÑÑо Ð±Ñ ÑпÑоÑÑиÑÑ Ð½Ð°Ñи пÑимеÑÑ. ÐдеÑÑ ÐµÑÑÑ
+одно иÑклÑÑение. РегиÑÑÑаÑÐ¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ None ÑдалÑÐµÑ ÑегиÑÑÑаÑÐ¸Ñ Ð´Ð»Ñ Ð»Ñбого
+заÑегиÑÑÑиÑованного пÑежде знаÑениÑ.
+
+ÐÑли обÑÐµÐºÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÑпеÑиÑикаÑии он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑоÑен Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
+ÑпеÑиÑикаÑии коÑоÑÐ°Ñ ÑаÑÑиÑÑÐµÑ ÑпеÑиÑикаÑÐ¸Ñ Ð¾Ñ ÐºÐ¾ÑоÑой он завиÑиÑ::
+
+ >>> class IR2(IR1):
+ ... pass
+ >>> registry.lookup([IR2], IP2, '')
+ 12
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ ÑеализÑÑÑий ÑпеÑиÑикаÑÐ¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа обÑекÑа::
+
+ >>> class C2:
+ ... zope.interface.implements(IR2)
+
+ >>> registry.lookup([zope.interface.implementedBy(C2)], IP2, '')
+ 12
+
+и обÑÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑоÑен Ð´Ð»Ñ Ð¸Ð½ÑеÑÑейÑов коÑоÑÑе пÑедоÑÑавлÑемÑй обÑекÑом
+инÑеÑÑÐµÐ¹Ñ ÑаÑÑиÑÑеÑ::
+
+ >>> registry.lookup([IR1], IP1, '')
+ 12
+ >>> registry.lookup([IR2], IP1, '')
+ 12
+
+Ðо еÑли Ð²Ñ ÑÑебÑеÑе ÑпеÑиÑикаÑÐ¸Ñ ÐºÐ¾ÑоÑÐ°Ñ Ð½Ðµ ÑаÑÑиÑÑÐµÑ ÑпеÑиÑикаÑÐ¸Ñ Ð¾Ñ ÐºÐ¾ÑоÑой
+завиÑÐ¸Ñ Ð¾Ð±ÑекÑ, Ð²Ñ Ð½Ðµ полÑÑиÑе ниÑего::
+
+ >>> registry.lookup([zope.interface.Interface], IP1, '')
+
+ÐÐµÐ¶Ð´Ñ Ð¿ÑоÑим, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ñи запÑоÑе::
+
+ >>> registry.lookup([zope.interface.Interface], IP1, '', 42)
+ 42
+
+ÐÑли Ð²Ñ Ð¿ÑобÑеÑе полÑÑиÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ ÐºÐ¾ÑоÑÑй обÑÐµÐºÑ Ð½Ðµ пÑедоÑÑавлÑÐµÑ Ð²Ñ Ñакже
+не полÑÑиÑе ниÑего::
+
+ >>> class IP3(IP2):
+ ... pass
+ >>> registry.lookup([IR1], IP3, '')
+
+ÐÑ Ñакже не полÑÑиÑе ниÑего еÑли Ð²Ñ Ð¸ÑполÑзÑеÑе невеÑное имÑ::
+
+ >>> registry.lookup([IR1], IP1, 'bob')
+ >>> registry.register([IR1], IP2, 'bob', "Bob's 12")
+ >>> registry.lookup([IR1], IP1, 'bob')
+ "Bob's 12"
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе не иÑполÑзоваÑÑ Ð¸Ð¼Ñ Ð¿Ñи запÑоÑе::
+
+ >>> registry.lookup([IR1], IP1)
+ 12
+
+ÐÑли Ð¼Ñ ÑегиÑÑÑиÑÑем обÑÐµÐºÑ ÐºÐ¾ÑоÑÑй пÑедоÑÑавлÑÐµÑ IP1::
+
+ >>> registry.register([IR1], IP1, '', 11)
+
+Ñогда ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑеимÑÑеÑÑво пеÑед O(12)::
+
+ >>> registry.lookup([IR1], IP1, '')
+ 11
+
+Также, еÑли Ð¼Ñ ÑегиÑÑÑиÑÑем обÑÐµÐºÑ Ð´Ð»Ñ IR2 Ñогда он бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑеимÑÑеÑÑво
+когда иÑполÑзÑеÑÑÑ IR2::
+
+ >>> registry.register([IR2], IP1, '', 21)
+ >>> registry.lookup([IR2], IP1, '')
+ 21
+
+ÐоиÑк Ñого, ÑÑо (еÑли вообÑе ÑÑо-Ñо) заÑегиÑÑÑиÑовано
+-----------------------------------------------------
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑпÑоÑиÑÑ ÐµÑÑÑ-ли адапÑÐµÑ Ð·Ð°ÑегиÑÑÑиÑованнÑй Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñа инÑеÑÑейÑов.
+ÐÑо оÑлиÑаеÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑного запÑоÑа Ñак как здеÑÑ Ð¼Ñ Ð¸Ñем ÑоÑное Ñовпадение::
+
+ >>> print registry.registered([IR1], IP1)
+ 11
+
+ >>> print registry.registered([IR1], IP2)
+ 12
+
+ >>> print registry.registered([IR1], IP2, 'bob')
+ Bob's 12
+
+
+ >>> print registry.registered([IR2], IP1)
+ 21
+
+ >>> print registry.registered([IR2], IP2)
+ None
+
+РпоÑледнем пÑимеÑе, None бÑл возвÑаÑен поÑомÑ, ÑÑо Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ инÑеÑÑейÑа
+ниÑего не бÑло заÑегиÑÑÑиÑовано.
+
+lookup1
+-------
+
+ÐапÑÐ¾Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñного адапÑеÑа - ÑÑо наиболее ÑаÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð¸ Ð´Ð»Ñ Ð½ÐµÐµ еÑÑÑ
+ÑпеÑиализиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа коÑоÑÐ°Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð½Ð° вÑ
од единÑÑвеннÑй
+ÑÑебÑемÑй инÑеÑÑейÑ::
+
+ >>> registry.lookup1(IR2, IP1, '')
+ 21
+ >>> registry.lookup1(IR2, IP1)
+ 21
+
+ÐдапÑаÑÐ¸Ñ Ð½Ð° пÑакÑике
+---------------------
+
+РееÑÑÑ Ð°Ð´Ð°Ð¿ÑеÑов пÑедназнаÑен Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки адапÑаÑии когда один обÑекÑ
+ÑеализÑÑÑий инÑеÑÑÐµÐ¹Ñ Ð°Ð´Ð°Ð¿ÑиÑÑеÑÑÑ Ðº дÑÑÐ³Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ ÐºÐ¾ÑоÑÑй поддеÑживаеÑ
+дÑÑгой инÑеÑÑейÑ. РееÑÑÑ Ð°Ð´Ð°Ð¿ÑеÑов Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð²ÑÑиÑление адапÑеÑов. Ð
+ÑÑом ÑлÑÑае Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑегиÑÑÑиÑоваÑÑ ÑабÑики Ð´Ð»Ñ Ð°Ð´Ð°Ð¿ÑеÑов::
+
+ >>> class IR(zope.interface.Interface):
+ ... pass
+
+ >>> class X:
+ ... zope.interface.implements(IR)
+
+ >>> class Y:
+ ... zope.interface.implements(IP1)
+ ... def __init__(self, context):
+ ... self.context = context
+
+ >>> registry.register([IR], IP1, '', Y)
+
+Ð ÑÑом ÑлÑÑае Ð¼Ñ ÑегиÑÑÑиÑÑем клаÑÑ ÐºÐ°Ðº ÑабÑикÑ. ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ
+`queryAdapter` Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑиÑованного обÑекÑа::
+
+ >>> x = X()
+ >>> y = registry.queryAdapter(x, IP1)
+ >>> y.__class__.__name__
+ 'Y'
+ >>> y.context is x
+ True
+
+ÐÑ Ñакже можем ÑегиÑÑÑиÑоваÑÑ Ð¸ запÑаÑиваÑÑ Ð¿Ð¾ имени::
+
+ >>> class Y2(Y):
+ ... pass
+
+ >>> registry.register([IR], IP1, 'bob', Y2)
+ >>> y = registry.queryAdapter(x, IP1, 'bob')
+ >>> y.__class__.__name__
+ 'Y2'
+ >>> y.context is x
+ True
+
+Ðогда ÑабÑика Ð´Ð»Ñ Ð°Ð´Ð°Ð¿ÑеÑа возвÑаÑÐ°ÐµÑ `None` - ÑÑо ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº еÑли бÑ
+адапÑÐµÑ Ð½Ðµ бÑл найден. ÐÑо позволÑÐµÑ Ð½Ð°Ð¼ избежаÑÑ Ð°Ð´Ð°Ð¿ÑаÑии (по желаниÑ) и даеÑ
+возможноÑÑÑ ÑабÑике адапÑеÑа опÑеделиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° ли адапÑаÑÐ¸Ñ Ð¾ÑновÑваÑÑÑ Ð½Ð°
+ÑоÑÑоÑнии обÑекÑа коÑоÑÑй адапÑиÑÑеÑÑÑ::
+
+ >>> def factory(context):
+ ... if context.name == 'object':
+ ... return 'adapter'
+ ... return None
+
+ >>> class Object(object):
+ ... zope.interface.implements(IR)
+ ... name = 'object'
+
+ >>> registry.register([IR], IP1, 'conditional', factory)
+ >>> obj = Object()
+ >>> registry.queryAdapter(obj, IP1, 'conditional')
+ 'adapter'
+ >>> obj.name = 'no object'
+ >>> registry.queryAdapter(obj, IP1, 'conditional') is None
+ True
+ >>> registry.queryAdapter(obj, IP1, 'conditional', 'default')
+ 'default'
+
+ÐлÑÑеÑнаÑивнÑй меÑод Ð´Ð»Ñ Ð¿ÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñакой же ÑÑнкÑионалÑноÑÑи как и
+`queryAdapter()` - ÑÑо `adapter_hook()`::
+
+ >>> y = registry.adapter_hook(IP1, x)
+ >>> y.__class__.__name__
+ 'Y'
+ >>> y.context is x
+ True
+ >>> y = registry.adapter_hook(IP1, x, 'bob')
+ >>> y.__class__.__name__
+ 'Y2'
+ >>> y.context is x
+ True
+
+`adapter_hook()` пÑоÑÑо менÑÐµÑ Ð¿Ð¾ÑÑдок аÑгÑменÑов Ð´Ð»Ñ Ð¾Ð±ÑекÑа и инÑеÑÑейÑа. ÐÑо
+иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑÑÑÐ°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² меÑ
анизм вÑзовов инÑеÑÑейÑов.
+
+ÐдапÑеÑÑ Ð¿Ð¾ ÑмолÑаниÑ
+---------------------
+
+Ðногда Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе заÑ
оÑеÑÑ Ð¿ÑедоÑÑавиÑÑ Ð°Ð´Ð°Ð¿ÑÐµÑ ÐºÐ¾ÑоÑÑй не бÑÐ´ÐµÑ Ð½Ð¸Ñего
+адапÑиÑоваÑÑ. ÐÐ»Ñ ÑÑого нÑжно пеÑедаÑÑ None как ÑÑебÑемÑй инÑеÑÑейÑ::
+
+ >>> registry.register([None], IP1, '', 1)
+
+поÑле ÑÑого Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð°Ð´Ð°Ð¿ÑÐµÑ Ð´Ð»Ñ Ð¸Ð½ÑеÑÑейÑов Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
Ñ
+Ð²Ð°Ñ Ð½ÐµÑ ÐºÐ¾Ð½ÐºÑеÑного адапÑеÑа::
+
+ >>> class IQ(zope.interface.Interface):
+ ... pass
+ >>> registry.lookup([IQ], IP1, '')
+ 1
+
+ÐонеÑно, конкÑеÑнÑе адапÑеÑÑ Ð²Ñе еÑе иÑполÑзÑÑÑÑÑ ÐºÐ¾Ð³Ð´Ð° необÑ
одимо::
+
+ >>> registry.lookup([IR2], IP1, '')
+ 21
+
+ÐдапÑеÑÑ ÐºÐ»Ð°ÑÑов
+----------------
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑегиÑÑÑиÑоваÑÑ Ð°Ð´Ð°Ð¿ÑеÑÑ Ð´Ð»Ñ Ð¾Ð¿Ñеделений клаÑÑов, ÑÑо бÑÐ´ÐµÑ Ð¿Ð¾Ñ
оже на
+ÑегиÑÑÑаÑÐ¸Ñ Ð¸Ñ
Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов::
+
+ >>> registry.register([zope.interface.implementedBy(C2)], IP1, '', 'C21')
+ >>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
+ 'C21'
+
+ÐдапÑеÑÑ Ð´Ð»Ñ ÑловаÑей
+---------------------
+
+Ркакой-Ñо Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±Ñло невозможно ÑегиÑÑÑиÑоваÑÑ Ð°Ð´Ð°Ð¿ÑеÑÑ Ð¾ÑнованнÑе на
+ÑловаÑÑÑ
из-за оÑибки. ÐавайÑе ÑдоÑÑовеÑимÑÑ ÑÑо ÑÑо ÑепеÑÑ ÑабоÑаеÑ::
+
+ >>> adapter = {}
+ >>> registry.register((), IQ, '', adapter)
+ >>> registry.lookup((), IQ, '') is adapter
+ True
+
+Удаление ÑегиÑÑÑаÑии
+--------------------
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑдалиÑÑ ÑегиÑÑÑаÑÐ¸Ñ ÑегиÑÑÑиÑÑÑ None вмеÑÑо обÑекÑа::
+
+ >>> registry.register([zope.interface.implementedBy(C2)], IP1, '', None)
+ >>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
+ 21
+
+ÐонеÑно ÑÑо знаÑиÑ, ÑÑо None не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÑегиÑÑÑиÑован. ÐÑо иÑклÑÑение к
+ÑÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð²ÑÑе о Ñом, ÑÑо ÑееÑÑÑ Ð½Ðµ забоÑиÑÑÑÑ Ð¾ Ñом, ÑÑо ÑегиÑÑÑиÑÑеÑÑÑ.
+
+ÐÑлÑÑи-адапÑеÑÑ
+===============
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе адапÑиÑоваÑÑ Ð½ÐµÑколÑко ÑпеÑиÑикаÑий::
+
+ >>> registry.register([IR1, IQ], IP2, '', '1q2')
+ >>> registry.lookup([IR1, IQ], IP2, '')
+ '1q2'
+ >>> registry.lookup([IR2, IQ], IP1, '')
+ '1q2'
+
+ >>> class IS(zope.interface.Interface):
+ ... pass
+ >>> registry.lookup([IR2, IS], IP1, '')
+
+ >>> class IQ2(IQ):
+ ... pass
+
+ >>> registry.lookup([IR2, IQ2], IP1, '')
+ '1q2'
+
+ >>> registry.register([IR1, IQ2], IP2, '', '1q22')
+ >>> registry.lookup([IR2, IQ2], IP1, '')
+ '1q22'
+
+ÐÑлÑÑи-адапÑаÑиÑ
+----------------
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе адапÑиÑоваÑÑ Ð½ÐµÑколÑко обÑекÑов::
+
+ >>> class Q:
+ ... zope.interface.implements(IQ)
+
+Ðак и Ñ Ð¾Ð´Ð¸Ð½Ð¾ÑнÑми адапÑеÑами, Ð¼Ñ ÑегиÑÑÑиÑÑем ÑабÑÐ¸ÐºÑ ÐºÐ¾ÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑ
+клаÑÑ::
+
+ >>> class IM(zope.interface.Interface):
+ ... pass
+ >>> class M:
+ ... zope.interface.implements(IM)
+ ... def __init__(self, x, q):
+ ... self.x, self.q = x, q
+ >>> registry.register([IR, IQ], IM, '', M)
+
+РзаÑем Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ `queryMultiAdapter` Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑа::
+
+ >>> q = Q()
+ >>> m = registry.queryMultiAdapter((x, q), IM)
+ >>> m.__class__.__name__
+ 'M'
+ >>> m.x is x and m.q is q
+ True
+
+и, конеÑно, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð°::
+
+ >>> class M2(M):
+ ... pass
+ >>> registry.register([IR, IQ], IM, 'bob', M2)
+ >>> m = registry.queryMultiAdapter((x, q), IM, 'bob')
+ >>> m.__class__.__name__
+ 'M2'
+ >>> m.x is x and m.q is q
+ True
+
+ÐдапÑеÑÑ Ð¿Ð¾ ÑмолÑаниÑ
+---------------------
+
+Ðак и Ð´Ð»Ñ Ð¾Ð´Ð¸Ð½Ð¾ÑнÑÑ
адапÑеÑов Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ Ð°Ð´Ð°Ð¿ÑÐµÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÐµÑедав
+None вмеÑÑо *пеÑвой* ÑпеÑиÑикаÑии::
+
+ >>> registry.register([None, IQ], IP2, '', 'q2')
+ >>> registry.lookup([IS, IQ], IP2, '')
+ 'q2'
+
+ÐÑлевÑе адапÑеÑÑ
+================
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе Ñакже адапÑиÑоваÑÑ Ð±ÐµÐ· ÑпеÑиÑикаÑии::
+
+ >>> registry.register([], IP2, '', 2)
+ >>> registry.lookup([], IP2, '')
+ 2
+ >>> registry.lookup([], IP1, '')
+ 2
+
+ÐеÑеÑиÑление именованнÑÑ
адапÑеÑов
+----------------------------------
+
+ÐдапÑеÑÑ Ð¸Ð¼ÐµÑÑ Ð¸Ð¼ÐµÐ½Ð°. Ðногда ÑÑо полезно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
именованнÑÑ
+адапÑеÑов Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ инÑеÑÑейÑа::
+
+ >>> adapters = list(registry.lookupAll([IR1], IP1))
+ >>> adapters.sort()
+ >>> adapters
+ [(u'', 11), (u'bob', "Bob's 12")]
+
+ÐÑо ÑабоÑÐ°ÐµÑ Ñакже и Ð´Ð»Ñ Ð¼ÑлÑÑи-адапÑеÑов::
+
+ >>> registry.register([IR1, IQ2], IP2, 'bob', '1q2 for bob')
+ >>> adapters = list(registry.lookupAll([IR2, IQ2], IP1))
+ >>> adapters.sort()
+ >>> adapters
+ [(u'', '1q22'), (u'bob', '1q2 for bob')]
+
+Рдаже Ð´Ð»Ñ Ð½ÑлевÑÑ
адапÑеÑов::
+
+ >>> registry.register([], IP2, 'bob', 3)
+ >>> adapters = list(registry.lookupAll([], IP1))
+ >>> adapters.sort()
+ >>> adapters
+ [(u'', 2), (u'bob', 3)]
+
+ÐодпиÑки
+========
+
+ÐбÑÑно Ð¼Ñ Ñ
оÑим запÑоÑиÑÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ¾ÑоÑÑй наиболее близко ÑооÑвеÑÑÑвÑеÑ
+ÑпеÑиÑикаÑии. Ðногда Ð¼Ñ Ñ
оÑим полÑÑиÑÑ Ð²Ñе обÑекÑÑ ÐºÐ¾ÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ
+какой-либо ÑпеÑиÑикаÑии. ÐÑ Ð¸ÑполÑзÑем подпиÑки Ð´Ð»Ñ ÑÑого. ÐÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑваем
+обÑекÑÑ Ð´Ð»Ñ ÑпеÑиÑикаÑий и заÑем позже наÑ
одим вÑе подпиÑаннÑе обÑекÑÑ::
+
+ >>> registry.subscribe([IR1], IP2, 'sub12 1')
+ >>> registry.subscriptions([IR1], IP2)
+ ['sub12 1']
+
+ÐамеÑÑÑе, ÑÑо в оÑлиÑие Ð¾Ñ Ð¾Ð±ÑÑнÑÑ
адапÑеÑов подпиÑки не имеÑÑ Ð¸Ð¼ÐµÐ½.
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе имеÑÑ Ð½ÐµÑколÑко подпиÑÑиков Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑпеÑиÑикаÑии::
+
+ >>> registry.subscribe([IR1], IP2, 'sub12 2')
+ >>> registry.subscriptions([IR1], IP2)
+ ['sub12 1', 'sub12 2']
+
+ÐÑли подпиÑÑики заÑегиÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¸Ñ
и ÑеÑ
же ÑÑебÑемÑÑ
инÑеÑÑейÑов, они
+возвÑаÑаÑÑÑÑ Ð² поÑÑдке опÑеделениÑ.
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе заÑегиÑÑÑиÑоваÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑики Ð´Ð»Ñ Ð²ÑеÑ
ÑпеÑиÑикаÑий иÑполÑзÑÑ None::
+
+ >>> registry.subscribe([None], IP1, 'sub_1')
+ >>> registry.subscriptions([IR2], IP1)
+ ['sub_1', 'sub12 1', 'sub12 2']
+
+ÐамеÑÑÑе, ÑÑо новÑй подпиÑÑик возвÑаÑаеÑÑÑ Ð¿ÐµÑвÑм. ÐодпиÑÑики опÑеделеннÑе
+Ð´Ð»Ñ Ð¼ÐµÐ½ÐµÐµ обÑиÑ
ÑÑебÑемÑÑ
инÑеÑÑейÑов возвÑаÑаÑÑÑÑ Ð¿ÐµÑед подпиÑÑиками
+Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ обÑиÑ
инÑеÑÑейÑов.
+
+ÐодпиÑки могÑÑ ÑмеÑиваÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð½ÐµÑколÑкими ÑовмеÑÑимÑми ÑпеÑиÑикаÑиÑми::
+
+ >>> registry.subscriptions([IR2], IP1)
+ ['sub_1', 'sub12 1', 'sub12 2']
+ >>> registry.subscribe([IR1], IP1, 'sub11')
+ >>> registry.subscriptions([IR2], IP1)
+ ['sub_1', 'sub12 1', 'sub12 2', 'sub11']
+ >>> registry.subscribe([IR2], IP2, 'sub22')
+ >>> registry.subscriptions([IR2], IP1)
+ ['sub_1', 'sub12 1', 'sub12 2', 'sub11', 'sub22']
+ >>> registry.subscriptions([IR2], IP2)
+ ['sub12 1', 'sub12 2', 'sub22']
+
+ÐодпиÑки могÑÑ ÑÑÑеÑÑвоваÑÑ Ð´Ð»Ñ Ð½ÐµÑколÑкиÑ
ÑпеÑиÑикаÑий::
+
+ >>> registry.subscribe([IR1, IQ], IP2, 'sub1q2')
+ >>> registry.subscriptions([IR1, IQ], IP2)
+ ['sub1q2']
+
+Ðак и Ñ Ð¾Ð´Ð¸Ð½Ð¾ÑнÑми подпиÑÑиками и адапÑеÑами без подпиÑок, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ
+None Ð´Ð»Ñ Ð¿ÐµÑвого ÑÑебÑемого инÑеÑÑейÑа, ÑÑо Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ::
+
+ >>> registry.subscribe([None, IQ], IP2, 'sub_q2')
+ >>> registry.subscriptions([IS, IQ], IP2)
+ ['sub_q2']
+ >>> registry.subscriptions([IR1, IQ], IP2)
+ ['sub_q2', 'sub1q2']
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки коÑоÑÑе незавиÑÐ¸Ð¼Ñ Ð¾Ñ Ð»ÑбÑÑ
ÑпеÑиÑикаÑий::
+
+ >>> list(registry.subscriptions([], IP1))
+ []
+
+ >>> registry.subscribe([], IP2, 'sub2')
+ >>> registry.subscriptions([], IP1)
+ ['sub2']
+ >>> registry.subscribe([], IP1, 'sub1')
+ >>> registry.subscriptions([], IP1)
+ ['sub2', 'sub1']
+ >>> registry.subscriptions([], IP2)
+ ['sub2']
+
+Удаление ÑегиÑÑÑаÑии подпиÑÑиков
+--------------------------------
+
+ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑдалÑÑÑ ÑегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиков. ÐÑи Ñдалении ÑегиÑÑÑаÑии подпиÑÑика
+Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑдалиÑÑ ÑегиÑÑÑаÑÐ¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ адапÑеÑа::
+
+ >>> registry.unsubscribe([IR1], IP1, 'sub11')
+ >>> registry.subscriptions([IR1], IP1)
+ ['sub_1', 'sub12 1', 'sub12 2']
+
+ÐÑли Ð¼Ñ Ð½Ðµ задаем никакого знаÑÐµÐ½Ð¸Ñ Ñогда подпиÑки бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð´Ð»Ñ Ð²ÑеÑ
+подпиÑÑиков ÑовпадаÑÑиÑ
Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм инÑеÑÑейÑом::
+
+ >>> registry.unsubscribe([IR1], IP2)
+ >>> registry.subscriptions([IR1], IP1)
+ ['sub_1']
+
+ÐдапÑеÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки
+-----------------
+
+ÐбÑÑно Ð¼Ñ ÑегиÑÑÑиÑÑем ÑабÑики Ð´Ð»Ñ Ð°Ð´Ð°Ð¿ÑеÑов коÑоÑÑе заÑем позволÑÑÑ Ð½Ð°Ð¼
+вÑÑиÑлÑÑÑ Ð°Ð´Ð°Ð¿ÑеÑÑ, но Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñками Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем неÑколÑко адапÑеÑов. ÐÑо пÑимеÑ
+подпиÑÑика Ð´Ð»Ñ Ð½ÐµÑколÑкиÑ
обÑекÑов::
+
+ >>> registry.subscribe([IR, IQ], IM, M)
+ >>> registry.subscribe([IR, IQ], IM, M2)
+
+ >>> subscribers = registry.subscribers((x, q), IM)
+ >>> len(subscribers)
+ 2
+ >>> class_names = [s.__class__.__name__ for s in subscribers]
+ >>> class_names.sort()
+ >>> class_names
+ ['M', 'M2']
+ >>> [(s.x is x and s.q is q) for s in subscribers]
+ [True, True]
+
+подпиÑÑики ÑабÑик адапÑеÑов не могÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ None::
+
+ >>> def M3(x, y):
+ ... return None
+
+ >>> registry.subscribe([IR, IQ], IM, M3)
+ >>> subscribers = registry.subscribers((x, q), IM)
+ >>> len(subscribers)
+ 2
+
+ÐбÑабоÑÑики
+-----------
+
+ÐбÑабоÑÑик - ÑÑо подпиÑÐ°Ð½Ð½Ð°Ñ ÑабÑика коÑоÑÐ°Ñ Ð½Ðµ возвÑаÑÐ°ÐµÑ Ð½Ð¾ÑмалÑного
+знаÑениÑ. Ðна возвÑаÑÐ°ÐµÑ None. ÐбÑабоÑÑик оÑлиÑаеÑÑÑ Ð¾Ñ Ð°Ð´Ð°Ð¿ÑеÑов Ñем, ÑÑо он
+Ð´ÐµÐ»Ð°ÐµÑ Ð²ÑÑ ÑабоÑÑ ÐºÐ¾Ð³Ð´Ð° вÑзÑваеÑÑÑ ÑабÑика.
+
+ÐÐ»Ñ ÑегиÑÑÑаÑии обÑабоÑÑика надо пÑоÑÑо пеÑедаÑÑ None как пÑедоÑÑавлÑемÑй
+инÑеÑÑейÑ::
+
+ >>> def handler(event):
+ ... print 'handler', event
+
+ >>> registry.subscribe([IR1], None, handler)
+ >>> registry.subscriptions([IR1], None) == [handler]
+ True
Property changes on: zope.interface/trunk/src/zope/interface/adapter.ru.txt
___________________________________________________________________
Name: svn:mime-type
+ text/plain; charset=utf-8
Name: svn:eol-style
+ native
Modified: zope.interface/trunk/src/zope/interface/adapter.txt
===================================================================
--- zope.interface/trunk/src/zope/interface/adapter.txt 2007-06-24 13:36:52 UTC (rev 77008)
+++ zope.interface/trunk/src/zope/interface/adapter.txt 2007-06-24 17:10:08 UTC (rev 77009)
@@ -436,7 +436,7 @@
['sub_1', 'sub12 1', 'sub12 2']
Note that the new subscriber is returned first. Subscribers defined
-for more general required interfaces are returned before subscribers
+for less general required interfaces are returned before subscribers
for more general interfaces.
Subscriptions may be combined over multiple compatible specifications::
@@ -485,7 +485,7 @@
-------------------------
We can unregister subscribers. When unregistering a subscriber, we
-can unregister a specific subscriber:
+can unregister a specific subscriber::
>>> registry.unsubscribe([IR1], IP1, 'sub11')
>>> registry.subscriptions([IR1], IP1)
@@ -519,7 +519,7 @@
>>> [(s.x is x and s.q is q) for s in subscribers]
[True, True]
-adapter factory subcribers can't return None values
+adapter factory subcribers can't return None values::
>>> def M3(x, y):
... return None
Modified: zope.interface/trunk/src/zope/interface/tests/test_adapter.py
===================================================================
--- zope.interface/trunk/src/zope/interface/tests/test_adapter.py 2007-06-24 13:36:52 UTC (rev 77008)
+++ zope.interface/trunk/src/zope/interface/tests/test_adapter.py 2007-06-24 17:10:08 UTC (rev 77009)
@@ -347,8 +347,9 @@
def test_suite():
from zope.testing import doctest, doctestunit
return unittest.TestSuite((
- doctestunit.DocFileSuite('../adapter.txt', '../human.txt',
- '../human.ru.txt', 'foodforthought.txt',
+ doctestunit.DocFileSuite('../adapter.txt', '../adapter.ru.txt',
+ '../human.txt', '../human.ru.txt',
+ 'foodforthought.txt',
globs={'__name__': '__main__'}),
doctest.DocTestSuite(),
))
More information about the Checkins
mailing list