Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
zope.interface / docs / _build / doctrees / adapter.ru.doctree
Size: Mime:
€cdocutils.nodes
document
q)q}q(UtagnameqUdocumentqUreporterqNU
attributesq}q(Udupnamesq	]Ubackrefsq
]UsourceXA/home/tseaver/projects/Zope/Z3/zope.interface/docs/adapter.ru.rstqUidsq]Uclassesq
]Unamesq]uUparse_messagesq]qcdocutils.nodes
system_message
q)q}q(hhhUsystem_messageqh}q(h	]h
]qUid11qaUlineMgh
]h]UlevelKUsourcehh]UtypeUINFOquUlineqMgUsourceqhU	rawsourceqUUparentqcdocutils.nodes
section
q)q}q(hhhUsectionq h}q!(h
]h	]q"X(адаптеры по умолчаниюq#ah]h]q$hah
]uhMghhhUhh)q%}q&(hhhh h}q'(h
]h	]h]q(Xмульти-адаптерыq)ah]q*Uid9q+ah
]uhM'hhhUhh)q,}q-(hhhh h}q.(h
]h	]h]q/Xреестр адаптеровq0ah]q1Uid1q2ah
]uhKhhhUhhUchildrenq3]q4(cdocutils.nodes
title
q5)q6}q7(hhhUtitleq8h}q9(h	]h
]Urefidq:Uid18q;h
]h]h]uhKhhhXРеестр адаптеровq<hh,h3]q=cdocutils.nodes
Text
q>XРеестр адаптеровq?…q@}qA(hh<hh6ubaubcdocutils.nodes
topic
qB)qC}qD(hhhUtopicqEh}qF(h
]h	]h]qGXcontentsqHah]qIUcontentsqJah
]qKUcontentsqLauhKhhhUhh,h3]qM(h5)qN}qO(hUhh8h}qP(h
]h	]h]h]h
]uhhCh3]qQh>XContentsqR…qS}qT(hUhhNubaubcdocutils.nodes
bullet_list
qU)qV}qW(hhhUbullet_listqXh}qY(h
]h	]h]h]h
]uhNhNhUhhCh3]qZcdocutils.nodes
list_item
q[)q\}q](hUhU	list_itemq^h}q_(h
]h	]h]h]h
]uhhVh3]q`(cdocutils.nodes
paragraph
qa)qb}qc(hUhU	paragraphqdh}qe(h
]h	]h]h]h
]uhh\h3]qfcdocutils.nodes
reference
qg)qh}qi(hUhU	referenceqjh}qk(h	]h
]Urefidh2h
]h]qlh;ah]uhhbh3]qmh>XРеестр адаптеровqn…qo}qp(hh<hhhubaubaubhU)qq}qr(hUhhXh}qs(h
]h	]h]h]h
]uhh\h3]qt(h[)qu}qv(hUhh^h}qw(h
]h	]h]h]h
]uhhqh3]qx(ha)qy}qz(hUhhdh}q{(h
]h	]h]h]h
]uhhuh3]q|hg)q}}q~(hUhhjh}q(h	]h
]UrefidUid2q€h
]h]qUid19q‚ah]uhhyh3]qƒh>X#Одиночные адаптерыq„…q…}q†(hX#Одиночные адаптерыq‡hh}ubaubaubhU)qˆ}q‰(hUhhXh}qŠ(h
]h	]h]h]h
]uhhuh3]q‹(h[)qŒ}q(hUhh^h}qŽ(h
]h	]h]h]h
]uhhˆh3]qha)q}q‘(hUhhdh}q’(h
]h	]h]h]h
]uhhŒh3]q“hg)q”}q•(hUhhjh}q–(h	]h
]UrefidUid3q—h
]h]q˜Uid20q™ah]uhhh3]qšh>X`Поиск того, что (если вообще что-то) зарегистрированоq›…qœ}q(hX`Поиск того, что (если вообще что-то) зарегистрированоqžhh”ubaubaubaubh[)qŸ}q (hUhh^h}q¡(h
]h	]h]h]h
]uhhˆh3]q¢ha)q£}q¤(hUhhdh}q¥(h
]h	]h]h]h
]uhhŸh3]q¦hg)q§}q¨(hUhhjh}q©(h	]h
]UrefidUlookup1qªh
]h]q«Uid21q¬ah]uhh£h3]q­h>Xlookup1q®…q¯}q°(hXlookup1q±hh§ubaubaubaubh[)q²}q³(hUhh^h}q´(h
]h	]h]h]h
]uhhˆh3]qµha)q¶}q·(hUhhdh}q¸(h
]h	]h]h]h
]uhh²h3]q¹hg)qº}q»(hUhhjh}q¼(h	]h
]UrefidUid4q½h
]h]q¾Uid22q¿ah]uhh¶h3]qÀh>X(Адаптация на практикеqEqÂ}qÃ(hX(Адаптация на практикеqÄhhºubaubaubaubh[)qÅ}qÆ(hUhh^h}qÇ(h
]h	]h]h]h
]uhhˆh3]qÈha)qÉ}qÊ(hUhhdh}qË(h
]h	]h]h]h
]uhhÅh3]qÌhg)qÍ}qÎ(hUhhjh}qÏ(h	]h
]UrefidUid5qÐh
]h]qÑUid23qÒah]uhhÉh3]qÓh>X(Адаптеры по умолчаниюqԅqÕ}qÖ(hX(Адаптеры по умолчаниюq×hhÍubaubaubaubh[)qØ}qÙ(hUhh^h}qÚ(h
]h	]h]h]h
]uhhˆh3]qÛha)qÜ}qÝ(hUhhdh}qÞ(h
]h	]h]h]h
]uhhØh3]qßhg)qà}qá(hUhhjh}qâ(h	]h
]UrefidUid6qãh
]h]qäUid24qåah]uhhÜh3]qæh>XАдаптеры классовq煁qè}qé(hXАдаптеры классовqêhhàubaubaubaubh[)që}qì(hUhh^h}qí(h
]h	]h]h]h
]uhhˆh3]qîha)qï}qð(hUhhdh}qñ(h
]h	]h]h]h
]uhhëh3]qòhg)qó}qô(hUhhjh}qõ(h	]h
]UrefidUid7qöh
]h]q÷Uid25qøah]uhhïh3]qùh>X(Адаптеры для словарейqú…qû}qü(hX(Адаптеры для словарейqýhhóubaubaubaubh[)qþ}qÿ(hUhh^h}r(h
]h	]h]h]h
]uhhˆh3]rha)r}r(hUhhdh}r(h
]h	]h]h]h
]uhhþh3]rhg)r}r(hUhhjh}r(h	]h
]UrefidUid8r	h
]h]r
Uid26rah]uhjh3]rh>X'Удаление регистрацииr
…r}r(hX'Удаление регистрацииrhjubaubaubaubeubeubh[)r}r(hUhh^h}r(h
]h	]h]h]h
]uhhqh3]r(ha)r}r(hUhhdh}r(h
]h	]h]h]h
]uhjh3]rhg)r}r(hUhhjh}r(h	]h
]Urefidh+h
]h]rUid27rah]uhjh3]rh>XМульти-адаптерыr…r }r!(hXМульти-адаптерыr"hjubaubaubhU)r#}r$(hUhhXh}r%(h
]h	]h]h]h
]uhjh3]r&(h[)r'}r((hUhh^h}r)(h
]h	]h]h]h
]uhj#h3]r*ha)r+}r,(hUhhdh}r-(h
]h	]h]h]h
]uhj'h3]r.hg)r/}r0(hUhhjh}r1(h	]h
]UrefidUid10r2h
]h]r3Uid28r4ah]uhj+h3]r5h>XМульти-адаптацияr6…r7}r8(hXМульти-адаптацияr9hj/ubaubaubaubh[)r:}r;(hUhh^h}r<(h
]h	]h]h]h
]uhj#h3]r=ha)r>}r?(hUhhdh}r@(h
]h	]h]h]h
]uhj:h3]rAhg)rB}rC(hUhhjh}rD(h	]h
]Urefidhh
]h]rEUid29rFah]uhj>h3]rGh>X(Адаптеры по умолчаниюrH…rI}rJ(hX(Адаптеры по умолчаниюrKhjBubaubaubaubeubeubh[)rL}rM(hUhh^h}rN(h
]h	]h]h]h
]uhhqh3]rO(ha)rP}rQ(hUhhdh}rR(h
]h	]h]h]h
]uhjLh3]rShg)rT}rU(hUhhjh}rV(h	]h
]UrefidUid12rWh
]h]rXUid30rYah]uhjPh3]rZh>XНулевые адаптерыr[…r\}r](hXНулевые адаптерыr^hjTubaubaubhU)r_}r`(hUhhXh}ra(h
]h	]h]h]h
]uhjLh3]rbh[)rc}rd(hUhh^h}re(h
]h	]h]h]h
]uhj_h3]rfha)rg}rh(hUhhdh}ri(h
]h	]h]h]h
]uhjch3]rjhg)rk}rl(hUhhjh}rm(h	]h
]UrefidUid13rnh
]h]roUid31rpah]uhjgh3]rqh>XBПеречисление именованных адаптеровrr…rs}rt(hXBПеречисление именованных адаптеровruhjkubaubaubaubaubeubh[)rv}rw(hUhh^h}rx(h
]h	]h]h]h
]uhhqh3]ry(ha)rz}r{(hUhhdh}r|(h
]h	]h]h]h
]uhjvh3]r}hg)r~}r(hUhhjh}r€(h	]h
]UrefidUid14rh
]h]r‚Uid32rƒah]uhjzh3]r„h>XПодпискиr……r†}r‡(hXПодпискиrˆhj~ubaubaubhU)r‰}rŠ(hUhhXh}r‹(h
]h	]h]h]h
]uhjvh3]rŒ(h[)r}rŽ(hUhh^h}r(h
]h	]h]h]h
]uhj‰h3]rha)r‘}r’(hUhhdh}r“(h
]h	]h]h]h
]uhjh3]r”hg)r•}r–(hUhhjh}r—(h	]h
]UrefidUid15r˜h
]h]r™Uid33ršah]uhj‘h3]r›h>X>Удаление регистрации подписчиковrœ…r}rž(hX>Удаление регистрации подписчиковrŸhj•ubaubaubaubh[)r }r¡(hUhh^h}r¢(h
]h	]h]h]h
]uhj‰h3]r£ha)r¤}r¥(hUhhdh}r¦(h
]h	]h]h]h
]uhj h3]r§hg)r¨}r©(hUhhjh}rª(h	]h
]UrefidUid16r«h
]h]r¬Uid34r­ah]uhj¤h3]r®h>X!Адаптеры подпискиr¯…r°}r±(hX!Адаптеры подпискиr²hj¨ubaubaubaubh[)r³}r´(hUhh^h}rµ(h
]h	]h]h]h
]uhj‰h3]r¶ha)r·}r¸(hUhhdh}r¹(h
]h	]h]h]h
]uhj³h3]rºhg)r»}r¼(hUhhjh}r½(h	]h
]UrefidUid17r¾h
]h]r¿Uid35rÀah]uhj·h3]rÁh>XОбработчикиrÂ…rÃ}rÄ(hXОбработчикиrÅhj»ubaubaubaubeubeubeubeubaubeubha)rÆ}rÇ(hhhhdh}rÈ(h
]h	]h]h]h
]uhKhhhX=Реестры адаптеров предоставляют возможность для регистрации объектов которые
зависят от одной, или нескольких спецификаций интерфейсов и предоставляют
(возможно не напрямую) какой-либо интерфейс. В дополнение, регистрации имеют
имена. (Можно думать об именах как о спецификаторах предоставляемого
интерфейса.)rÉhh,h3]rÊh>X=Реестры адаптеров предоставляют возможность для регистрации объектов которые
зависят от одной, или нескольких спецификаций интерфейсов и предоставляют
(возможно не напрямую) какой-либо интерфейс. В дополнение, регистрации имеют
имена. (Можно думать об именах как о спецификаторах предоставляемого
интерфейса.)rË…rÌ}rÍ(hjÉhjÆubaubha)rÎ}rÏ(hhhhdh}rÐ(h
]h	]h]h]h
]uhK
hhhX!Термин "спецификация интерфейса" ссылается и на интерфейсы и на определения
интерфейсов, такие как определения интерфейсов реализованных некоторым классом.rÑhh,h3]rÒh>X!Термин "спецификация интерфейса" ссылается и на интерфейсы и на определения
интерфейсов, такие как определения интерфейсов реализованных некоторым классом.rÓ…rÔ}rÕ(hjÑhjÎubaubh)rÖ}r×(hhhh h}rØ(h
]h	]h]rÙX#одиночные адаптерыrÚah]rÛh€ah
]uhKhhhUhh,h3]rÜ(h5)rÝ}rÞ(hhhh8h}rß(h	]h
]h:h‚h
]h]h]uhKhhhh‡hjÖh3]ràh>X#Одиночные адаптерыrᅁrâ}rã(hh‡hjÝubaubha)rä}rå(hhhhdh}ræ(h
]h	]h]h]h
]uhKhhhXŸДавайте рассмотрим простой пример использующий единственную требуемую
спецификацию::hjÖh3]rçh>XžДавайте рассмотрим простой пример использующий единственную требуемую
спецификацию:r腁ré}rê(hXžДавайте рассмотрим простой пример использующий единственную требуемую
спецификацию:hjäubaubcdocutils.nodes
literal_block
rë)rì}rí(hhhU
literal_blockrîh}rï(h	]h
]U	xml:spacerðUpreserverñh
]h]h]uhKhhhX>>> 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()hjÖh3]ròh>X>>> 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()ró…rô}rõ(hUhjìubaubha)rö}r÷(hhhhdh}rø(h
]h	]h]h]h
]uhK"hhhX{Мы зарегистрируем объект который зависит от IR1 и "предоставляет" IP2::rùhjÖh3]rúh>XzМы зарегистрируем объект который зависит от IR1 и "предоставляет" IP2:rû…rü}rý(hXzМы зарегистрируем объект который зависит от IR1 и "предоставляет" IP2:hjöubaubjë)rþ}rÿ(hhhjîh}r(h	]h
]jðjñh
]h]h]uhK$hhhX)>>> registry.register([IR1], IP2, '', 12)hjÖh3]rh>X)>>> registry.register([IR1], IP2, '', 12)r…r}r(hUhjþubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhK&hhhX^После регистрации мы можем запросить объект снова::rhjÖh3]r	h>X]После регистрации мы можем запросить объект снова:r
…r}r(hX]После регистрации мы можем запросить объект снова:hjubaubjë)r
}r(hhhjîh}r(h	]h
]jðjñh
]h]h]uhK(hhhX&>>> registry.lookup([IR1], IP2, '')
12hjÖh3]rh>X&>>> registry.lookup([IR1], IP2, '')
12r…r}r(hUhj
ubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhK+hhhXЗаметьте, что мы используем целое в этом примере. В реальных приложениях вы
можете использовать объекты которые на самом деле зависят или предоставляют
интерфейсы. Реестр не заботиться о том, что регистрируется и таким образом мы
можем использовать целые, или строки что бы упростить наши примеры. Здесь есть
одно исключение. Регистрация значения None удаляет регистрацию для любого
зарегистрированного прежде значения.rhjÖh3]rh>XЗаметьте, что мы используем целое в этом примере. В реальных приложениях вы
можете использовать объекты которые на самом деле зависят или предоставляют
интерфейсы. Реестр не заботиться о том, что регистрируется и таким образом мы
можем использовать целые, или строки что бы упростить наши примеры. Здесь есть
одно исключение. Регистрация значения None удаляет регистрацию для любого
зарегистрированного прежде значения.r…r}r(hjhjubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhK2hhhXüЕсли объект зависит от спецификации он может быть запрошен с помощью
спецификации которая расширяет спецификацию от которой он зависит::hjÖh3]rh>XûЕсли объект зависит от спецификации он может быть запрошен с помощью
спецификации которая расширяет спецификацию от которой он зависит:r …r!}r"(hXûЕсли объект зависит от спецификации он может быть запрошен с помощью
спецификации которая расширяет спецификацию от которой он зависит:hjubaubjë)r#}r$(hhhjîh}r%(h	]h
]jðjñh
]h]h]uhK5hhhXG>>> class IR2(IR1):
...     pass
>>> registry.lookup([IR2], IP2, '')
12hjÖh3]r&h>XG>>> class IR2(IR1):
...     pass
>>> registry.lookup([IR2], IP2, '')
12r'…r(}r)(hUhj#ubaubha)r*}r+(hhhhdh}r,(h
]h	]h]h]h
]uhK:hhhXŠМы можем использовать класс реализующий спецификацию для запроса объекта::r-hjÖh3]r.h>X‰Мы можем использовать класс реализующий спецификацию для запроса объекта:r/…r0}r1(hX‰Мы можем использовать класс реализующий спецификацию для запроса объекта:hj*ubaubjë)r2}r3(hhhjîh}r4(h	]h
]jðjñh
]h]h]uhK<hhhXy>>> class C2:
...     zope.interface.implements(IR2)

>>> registry.lookup([zope.interface.implementedBy(C2)], IP2, '')
12hjÖh3]r5h>Xy>>> class C2:
...     zope.interface.implements(IR2)

>>> registry.lookup([zope.interface.implementedBy(C2)], IP2, '')
12r6…r7}r8(hUhj2ubaubha)r9}r:(hhhhdh}r;(h
]h	]h]h]h
]uhKBhhhX¹и объект может быть запрошен для интерфейсов которые предоставляемый объектом
интерфейс расширяет::hjÖh3]r<h>X¸и объект может быть запрошен для интерфейсов которые предоставляемый объектом
интерфейс расширяет:r=…r>}r?(hX¸и объект может быть запрошен для интерфейсов которые предоставляемый объектом
интерфейс расширяет:hj9ubaubjë)r@}rA(hhhjîh}rB(h	]h
]jðjñh
]h]h]uhKEhhhXM>>> registry.lookup([IR1], IP1, '')
12
>>> registry.lookup([IR2], IP1, '')
12hjÖh3]rCh>XM>>> registry.lookup([IR1], IP1, '')
12
>>> registry.lookup([IR2], IP1, '')
12rD…rE}rF(hUhj@ubaubha)rG}rH(hhhhdh}rI(h
]h	]h]h]h
]uhKJhhhX×Но если вы требуете спецификацию которая не расширяет спецификацию от которой
зависит объект, вы не получите ничего::hjÖh3]rJh>XÖНо если вы требуете спецификацию которая не расширяет спецификацию от которой
зависит объект, вы не получите ничего:rK…rL}rM(hXÖНо если вы требуете спецификацию которая не расширяет спецификацию от которой
зависит объект, вы не получите ничего:hjGubaubjë)rN}rO(hhhjîh}rP(h	]h
]jðjñh
]h]h]uhKMhhhX8>>> registry.lookup([zope.interface.Interface], IP1, '')hjÖh3]rQh>X8>>> registry.lookup([zope.interface.Interface], IP1, '')rR…rS}rT(hUhjNubaubha)rU}rV(hhhhdh}rW(h
]h	]h]h]h
]uhKOhhhX|Между прочим, вы можете передать значение по умолчанию при запросе::rXhjÖh3]rYh>X{Между прочим, вы можете передать значение по умолчанию при запросе:rZ…r[}r\(hX{Между прочим, вы можете передать значение по умолчанию при запросе:hjUubaubjë)r]}r^(hhhjîh}r_(h	]h
]jðjñh
]h]h]uhKQhhhX?>>> registry.lookup([zope.interface.Interface], IP1, '', 42)
42hjÖh3]r`h>X?>>> registry.lookup([zope.interface.Interface], IP1, '', 42)
42ra…rb}rc(hUhj]ubaubha)rd}re(hhhhdh}rf(h
]h	]h]h]h
]uhKThhhX³Если вы пробуете получить интерфейс который объект не предоставляет вы также
не получите ничего::hjÖh3]rgh>X²Если вы пробуете получить интерфейс который объект не предоставляет вы также
не получите ничего:rh…ri}rj(hX²Если вы пробуете получить интерфейс который объект не предоставляет вы также
не получите ничего:hjdubaubjë)rk}rl(hhhjîh}rm(h	]h
]jðjñh
]h]h]uhKWhhhXD>>> class IP3(IP2):
...     pass
>>> registry.lookup([IR1], IP3, '')hjÖh3]rnh>XD>>> class IP3(IP2):
...     pass
>>> registry.lookup([IR1], IP3, '')ro…rp}rq(hUhjkubaubha)rr}rs(hhhhdh}rt(h
]h	]h]h]h
]uhK[hhhXqВы также не получите ничего если вы используете неверное имя::ruhjÖh3]rvh>XpВы также не получите ничего если вы используете неверное имя:rw…rx}ry(hXpВы также не получите ничего если вы используете неверное имя:hjrubaubjë)rz}r{(hhhjîh}r|(h	]h
]jðjñh
]h]h]uhK]hhhX>>> registry.lookup([IR1], IP1, 'bob')
>>> registry.register([IR1], IP2, 'bob', "Bob's 12")
>>> registry.lookup([IR1], IP1, 'bob')
"Bob's 12"hjÖh3]r}h>X>>> registry.lookup([IR1], IP1, 'bob')
>>> registry.register([IR1], IP2, 'bob', "Bob's 12")
>>> registry.lookup([IR1], IP1, 'bob')
"Bob's 12"r~…r}r€(hUhjzubaubha)r}r‚(hhhhdh}rƒ(h
]h	]h]h]h
]uhKbhhhXNВы можете не использовать имя при запросе::r„hjÖh3]r…h>XMВы можете не использовать имя при запросе:r†…r‡}rˆ(hXMВы можете не использовать имя при запросе:hjubaubjë)r‰}rŠ(hhhjîh}r‹(h	]h
]jðjñh
]h]h]uhKdhhhX">>> registry.lookup([IR1], IP1)
12hjÖh3]rŒh>X">>> registry.lookup([IR1], IP1)
12r…rŽ}r(hUhj‰ubaubha)r}r‘(hhhhdh}r’(h
]h	]h]h]h
]uhKghhhXcЕсли мы регистрируем объект который предоставляет IP1::r“hjÖh3]r”h>XbЕсли мы регистрируем объект который предоставляет IP1:r•…r–}r—(hXbЕсли мы регистрируем объект который предоставляет IP1:hjubaubjë)r˜}r™(hhhjîh}rš(h	]h
]jðjñh
]h]h]uhKihhhX)>>> registry.register([IR1], IP1, '', 11)hjÖh3]r›h>X)>>> registry.register([IR1], IP1, '', 11)rœ…r}rž(hUhj˜ubaubha)rŸ}r (hhhhdh}r¡(h
]h	]h]h]h
]uhKkhhhXbтогда этот объект будет иметь преимущество перед O(12)::r¢hjÖh3]r£h>Xaтогда этот объект будет иметь преимущество перед O(12):r¤…r¥}r¦(hXaтогда этот объект будет иметь преимущество перед O(12):hjŸubaubjë)r§}r¨(hhhjîh}r©(h	]h
]jðjñh
]h]h]uhKmhhhX&>>> registry.lookup([IR1], IP1, '')
11hjÖh3]rªh>X&>>> registry.lookup([IR1], IP1, '')
11r«…r¬}r­(hUhj§ubaubha)r®}r¯(hhhhdh}r°(h
]h	]h]h]h
]uhKphhhX³Также, если мы регистрируем объект для IR2 тогда он будет иметь преимущество
когда используется IR2::hjÖh3]r±h>X²Также, если мы регистрируем объект для IR2 тогда он будет иметь преимущество
когда используется IR2:r²…r³}r´(hX²Также, если мы регистрируем объект для IR2 тогда он будет иметь преимущество
когда используется IR2:hj®ubaubjë)rµ}r¶(hhhjîh}r·(h	]h
]jðjñh
]h]h]uhKshhhXP>>> registry.register([IR2], IP1, '', 21)
>>> registry.lookup([IR2], IP1, '')
21hjÖh3]r¸h>XP>>> registry.register([IR2], IP1, '', 21)
>>> registry.lookup([IR2], IP1, '')
21r¹…rº}r»(hUhjµubaubh)r¼}r½(hhhh h}r¾(h
]h	]h]r¿X`поиск того, что (если вообще что-то) зарегистрированоrÀah]rÁh—ah
]uhKxhhhUhjÖh3]rÂ(h5)rÃ}rÄ(hhhh8h}rÅ(h	]h
]h:h™h
]h]h]uhKxhhhhžhj¼h3]rÆh>X`Поиск того, что (если вообще что-то) зарегистрированоrÇ…rÈ}rÉ(hhžhjÃubaubha)rÊ}rË(hhhhdh}rÌ(h
]h	]h]h]h
]uhKzhhhXМы можем спросить есть-ли адаптер зарегистрированный для набора интерфейсов.
Это отличается от обычного запроса так как здесь мы ищем точное совпадение::hj¼h3]rÍh>XМы можем спросить есть-ли адаптер зарегистрированный для набора интерфейсов.
Это отличается от обычного запроса так как здесь мы ищем точное совпадение:rÎ…rÏ}rÐ(hXМы можем спросить есть-ли адаптер зарегистрированный для набора интерфейсов.
Это отличается от обычного запроса так как здесь мы ищем точное совпадение:hjÊubaubjë)rÑ}rÒ(hhhjîh}rÓ(h	]h
]jðjñh
]h]h]uhK}hhhXô>>> 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)
Nonehj¼h3]rÔh>Xô>>> 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)
NonerÕ…rÖ}r×(hUhjÑubaubha)rØ}rÙ(hhhhdh}rÚ(h
]h	]h]h]h
]uhKhhhXÁВ последнем примере, None был возвращен потому, что для данного интерфейса
ничего не было зарегистрировано.rÛhj¼h3]rÜh>XÁВ последнем примере, None был возвращен потому, что для данного интерфейса
ничего не было зарегистрировано.rÝ…rÞ}rß(hjÛhjØubaubeubh)rà}rá(hhhh h}râ(h
]h	]h]rãXlookup1räah]råhªah
]uhK‘hhhUhjÖh3]ræ(h5)rç}rè(hhhh8h}ré(h	]h
]h:h¬h
]h]h]uhK‘hhhh±hjàh3]rêh>Xlookup1r녁rì}rí(hh±hjçubaubha)rî}rï(hhhhdh}rð(h
]h	]h]h]h
]uhK“hhhX4Запрос одиночного адаптера - это наиболее частая операция и для нее есть
специализированная версия запроса которая получает на вход единственный
требуемый интерфейс::hjàh3]rñh>X3Запрос одиночного адаптера - это наиболее частая операция и для нее есть
специализированная версия запроса которая получает на вход единственный
требуемый интерфейс:rò…ró}rô(hX3Запрос одиночного адаптера - это наиболее частая операция и для нее есть
специализированная версия запроса которая получает на вход единственный
требуемый интерфейс:hjîubaubjë)rõ}rö(hhhjîh}r÷(h	]h
]jðjñh
]h]h]uhK—hhhXG>>> registry.lookup1(IR2, IP1, '')
21
>>> registry.lookup1(IR2, IP1)
21hjàh3]røh>XG>>> registry.lookup1(IR2, IP1, '')
21
>>> registry.lookup1(IR2, IP1)
21rù…rú}rû(hUhjõubaubeubh)rü}rý(hhhh h}rþ(h
]h	]h]rÿX(адаптация на практикеrah]rh½ah
]uhKhhhUhjÖh3]r(h5)r}r(hhhh8h}r(h	]h
]h:h¿h
]h]h]uhKhhhhÄhjüh3]rh>X(Адаптация на практикеr…r}r	(hhÄhjubaubha)r
}r(hhhhdh}r(h
]h	]h]h]h
]uhKŸhhhXРеестр адаптеров предназначен для поддержки адаптации когда один объект
реализующий интерфейс адаптируется к другому объекту который поддерживает
другой интерфейс. Реестр адаптеров также поддерживает вычисление адаптеров. В
этом случае мы должны регистрировать фабрики для адаптеров::hjüh3]r
h>XРеестр адаптеров предназначен для поддержки адаптации когда один объект
реализующий интерфейс адаптируется к другому объекту который поддерживает
другой интерфейс. Реестр адаптеров также поддерживает вычисление адаптеров. В
этом случае мы должны регистрировать фабрики для адаптеров:r…r}r(hXРеестр адаптеров предназначен для поддержки адаптации когда один объект
реализующий интерфейс адаптируется к другому объекту который поддерживает
другой интерфейс. Реестр адаптеров также поддерживает вычисление адаптеров. В
этом случае мы должны регистрировать фабрики для адаптеров:hj
ubaubjë)r}r(hhhjîh}r(h	]h
]jðjñh
]h]h]uhK¤hhhX >>> 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)hjüh3]rh>X >>> 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)r…r}r(hUhjubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhK±hhhXÝВ этом случае мы регистрируем класс как фабрику. Теперь мы можем вызвать
`queryAdapter` для получения адаптированного объекта::hjüh3]r(h>X…В этом случае мы регистрируем класс как фабрику. Теперь мы можем вызвать
r…r}r(hX…В этом случае мы регистрируем класс как фабрику. Теперь мы можем вызвать
hjubcdocutils.nodes
title_reference
r)r }r!(hX`queryAdapter`hUtitle_referencer"h}r#(h
]h	]h]h]h
]uhjh3]r$h>XqueryAdapterr%…r&}r'(hUhj ubaubh>XI для получения адаптированного объекта:r(…r)}r*(hXI для получения адаптированного объекта:hjubeubjë)r+}r,(hhhjîh}r-(h	]h
]jðjñh
]h]h]uhK´hhhXf>>> x = X()
>>> y = registry.queryAdapter(x, IP1)
>>> y.__class__.__name__
'Y'
>>> y.context is x
Truehjüh3]r.h>Xf>>> x = X()
>>> y = registry.queryAdapter(x, IP1)
>>> y.__class__.__name__
'Y'
>>> y.context is x
Truer/…r0}r1(hUhj+ubaubha)r2}r3(hhhhdh}r4(h
]h	]h]h]h
]uhK»hhhXcМы также можем регистрировать и запрашивать по имени::r5hjüh3]r6h>XbМы также можем регистрировать и запрашивать по имени:r7…r8}r9(hXbМы также можем регистрировать и запрашивать по имени:hj2ubaubjë)r:}r;(hhhjîh}r<(h	]h
]jðjñh
]h]h]uhK½hhhX­>>> class Y2(Y):
...     pass

>>> registry.register([IR], IP1, 'bob', Y2)
>>> y = registry.queryAdapter(x, IP1, 'bob')
>>> y.__class__.__name__
'Y2'
>>> y.context is x
Truehjüh3]r=h>X­>>> class Y2(Y):
...     pass

>>> registry.register([IR], IP1, 'bob', Y2)
>>> y = registry.queryAdapter(x, IP1, 'bob')
>>> y.__class__.__name__
'Y2'
>>> y.context is x
Truer>…r?}r@(hUhj:ubaubha)rA}rB(hhhhdh}rC(h
]h	]h]h]h
]uhKÇhhhX÷Когда фабрика для адаптера возвращает `None` - это рассматривается как если бы
адаптер не был найден. Это позволяет нам избежать адаптации (по желанию) и дает
возможность фабрике адаптера определить возможна ли адаптация основываясь на
состоянии объекта который адаптируется::hjüh3]rD(h>XGКогда фабрика для адаптера возвращает rE…rF}rG(hXGКогда фабрика для адаптера возвращает hjAubj)rH}rI(hX`None`hj"h}rJ(h
]h	]h]h]h
]uhjAh3]rKh>XNonerL…rM}rN(hUhjHubaubh>X© - это рассматривается как если бы
адаптер не был найден. Это позволяет нам избежать адаптации (по желанию) и дает
возможность фабрике адаптера определить возможна ли адаптация основываясь на
состоянии объекта который адаптируется:rO…rP}rQ(hX© - это рассматривается как если бы
адаптер не был найден. Это позволяет нам избежать адаптации (по желанию) и дает
возможность фабрике адаптера определить возможна ли адаптация основываясь на
состоянии объекта который адаптируется:hjAubeubjë)rR}rS(hhhjîh}rT(h	]h
]jðjñh
]h]h]uhKÌhhhXõ>>> 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'hjüh3]rUh>Xõ>>> 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'rV…rW}rX(hUhjRubaubha)rY}rZ(hhhhdh}r[(h
]h	]h]h]h
]uhKßhhhX³Альтернативный метод для предоставления такой же функциональности как и
`queryAdapter()` - это `adapter_hook()`::hjüh3]r\(h>X‡Альтернативный метод для предоставления такой же функциональности как и
r]…r^}r_(hX‡Альтернативный метод для предоставления такой же функциональности как и
hjYubj)r`}ra(hX`queryAdapter()`hj"h}rb(h
]h	]h]h]h
]uhjYh3]rch>XqueryAdapter()rd…re}rf(hUhj`ubaubh>X
 - это rg…rh}ri(hX
 - это hjYubj)rj}rk(hX`adapter_hook()`hj"h}rl(h
]h	]h]h]h
]uhjYh3]rmh>Xadapter_hook()rn…ro}rp(hUhjjubaubh>X:…rq}rr(hX:hjYubeubjë)rs}rt(hhhjîh}ru(h	]h
]jðjñh
]h]h]uhKâhhhX½>>> 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
Truehjüh3]rvh>X½>>> 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
Truerw…rx}ry(hUhjsubaubha)rz}r{(hhhhdh}r|(h
]h	]h]h]h
]uhKíhhhXö`adapter_hook()` просто меняет порядок аргументов для объекта и интерфейса. Это
используется для встраивания в механизм вызовов интерфейсов.hjüh3]r}(j)r~}r(hX`adapter_hook()`hj"h}r€(h
]h	]h]h]h
]uhjzh3]rh>Xadapter_hook()r‚…rƒ}r„(hUhj~ubaubh>Xæ просто меняет порядок аргументов для объекта и интерфейса. Это
используется для встраивания в механизм вызовов интерфейсов.r……r†}r‡(hXæ просто меняет порядок аргументов для объекта и интерфейса. Это
используется для встраивания в механизм вызовов интерфейсов.hjzubeubeubh)rˆ}r‰(hhhh h}rŠ(h
]h	]r‹h#ah]h]rŒhÐah
]uhKñhhhUhjÖU
referencedrKh3]rŽ(h5)r}r(hhhh8h}r‘(h	]h
]h:hÒh
]h]h]uhKñhhhh×hjˆh3]r’h>X(Адаптеры по умолчаниюr“…r”}r•(hh×hjubaubha)r–}r—(hhhhdh}r˜(h
]h	]h]h]h
]uhKóhhhXÿИногда вы можете захотеть предоставить адаптер который не будет ничего
адаптировать. Для этого нужно передать None как требуемый интерфейс::hjˆh3]r™h>XþИногда вы можете захотеть предоставить адаптер который не будет ничего
адаптировать. Для этого нужно передать None как требуемый интерфейс:rš…r›}rœ(hXþИногда вы можете захотеть предоставить адаптер который не будет ничего
адаптировать. Для этого нужно передать None как требуемый интерфейс:hj–ubaubjë)r}rž(hhhjîh}rŸ(h	]h
]jðjñh
]h]h]uhKöhhhX)>>> registry.register([None], IP1, '', 1)hjˆh3]r h>X)>>> registry.register([None], IP1, '', 1)r¡…r¢}r£(hUhjubaubha)r¤}r¥(hhhhdh}r¦(h
]h	]h]h]h
]uhKøhhhXÇпосле этого вы можете использовать этот адаптер для интерфейсов для которых у
вас нет конкретного адаптера::hjˆh3]r§h>XÆпосле этого вы можете использовать этот адаптер для интерфейсов для которых у
вас нет конкретного адаптера:r¨…r©}rª(hXÆпосле этого вы можете использовать этот адаптер для интерфейсов для которых у
вас нет конкретного адаптера:hj¤ubaubjë)r«}r¬(hhhjîh}r­(h	]h
]jðjñh
]h]h]uhKûhhhXY>>> class IQ(zope.interface.Interface):
...     pass
>>> registry.lookup([IQ], IP1, '')
1hjˆh3]r®h>XY>>> class IQ(zope.interface.Interface):
...     pass
>>> registry.lookup([IQ], IP1, '')
1r¯…r°}r±(hUhj«ubaubha)r²}r³(hhhhdh}r´(h
]h	]h]h]h
]uhMhhhX~Конечно, конкретные адаптеры все еще используются когда необходимо::rµhjˆh3]r¶h>X}Конечно, конкретные адаптеры все еще используются когда необходимо:r·…r¸}r¹(hX}Конечно, конкретные адаптеры все еще используются когда необходимо:hj²ubaubjë)rº}r»(hhhjîh}r¼(h	]h
]jðjñh
]h]h]uhMhhhX&>>> registry.lookup([IR2], IP1, '')
21hjˆh3]r½h>X&>>> registry.lookup([IR2], IP1, '')
21r¾…r¿}rÀ(hUhjºubaubeubh)rÁ}rÂ(hhhh h}rÃ(h
]h	]h]rÄXадаптеры классовrÅah]rÆhãah
]uhMhhhUhjÖh3]rÇ(h5)rÈ}rÉ(hhhh8h}rÊ(h	]h
]h:håh
]h]h]uhMhhhhêhjÁh3]rËh>XАдаптеры классовrÌ…rÍ}rÎ(hhêhjÈubaubha)rÏ}rÐ(hhhhdh}rÑ(h
]h	]h]h]h
]uhMhhhXÅВы можете регистрировать адаптеры для определений классов, что будет похоже на
регистрацию их для классов::hjÁh3]rÒh>XÄВы можете регистрировать адаптеры для определений классов, что будет похоже на
регистрацию их для классов:rÓ…rÔ}rÕ(hXÄВы можете регистрировать адаптеры для определений классов, что будет похоже на
регистрацию их для классов:hjÏubaubjë)rÖ}r×(hhhjîh}rØ(h	]h
]jðjñh
]h]h]uhMhhhX>>> registry.register([zope.interface.implementedBy(C2)], IP1, '', 'C21')
>>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
'C21'hjÁh3]rÙh>X>>> registry.register([zope.interface.implementedBy(C2)], IP1, '', 'C21')
>>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
'C21'rÚ…rÛ}rÜ(hUhjÖubaubeubh)rÝ}rÞ(hhhh h}rß(h
]h	]h]ràX(адаптеры для словарейráah]râhöah
]uhMhhhUhjÖh3]rã(h5)rä}rå(hhhh8h}ræ(h	]h
]h:høh
]h]h]uhMhhhhýhjÝh3]rçh>X(Адаптеры для словарейr腁ré}rê(hhýhjäubaubha)rë}rì(hhhhdh}rí(h
]h	]h]h]h
]uhMhhhXВ какой-то момент было невозможно регистрировать адаптеры основанные на
словарях из-за ошибки. Давайте удостоверимся что это теперь работает::hjÝh3]rîh>XВ какой-то момент было невозможно регистрировать адаптеры основанные на
словарях из-за ошибки. Давайте удостоверимся что это теперь работает:rrð}rñ(hXВ какой-то момент было невозможно регистрировать адаптеры основанные на
словарях из-за ошибки. Давайте удостоверимся что это теперь работает:hjëubaubjë)rò}ró(hhhjîh}rô(h	]h
]jðjñh
]h]h]uhMhhhXk>>> adapter = {}
>>> registry.register((), IQ, '', adapter)
>>> registry.lookup((), IQ, '') is adapter
TruehjÝh3]rõh>Xk>>> adapter = {}
>>> registry.register((), IQ, '', adapter)
>>> registry.lookup((), IQ, '') is adapter
Truerö…r÷}rø(hUhjòubaubeubh)rù}rú(hhhh h}rû(h
]h	]h]rüX'удаление регистрацииrýah]rþj	ah
]uhMhhhUhjÖh3]rÿ(h5)r}r(hhhh8h}r(h	]h
]h:jh
]h]h]uhMhhhjhjùh3]rh>X'Удаление регистрацииr…r}r(hjhjubaubha)r}r(hhhhdh}r	(h
]h	]h]h]h
]uhMhhhXqВы можете удалить регистрацию регистрируя None вместо объекта::r
hjùh3]rh>XpВы можете удалить регистрацию регистрируя None вместо объекта:r…r
}r(hXpВы можете удалить регистрацию регистрируя None вместо объекта:hjubaubjë)r}r(hhhjîh}r(h	]h
]jðjñh
]h]h]uhMhhhXŒ>>> registry.register([zope.interface.implementedBy(C2)], IP1, '', None)
>>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
21hjùh3]rh>XŒ>>> registry.register([zope.interface.implementedBy(C2)], IP1, '', None)
>>> registry.lookup([zope.interface.implementedBy(C2)], IP1, '')
21r…r}r(hUhjubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhM#hhhXКонечно это значит, что None не может быть зарегистрирован. Это исключение к
утверждению выше о том, что реестр не заботиться о том, что регистрируется.rhjùh3]rh>XКонечно это значит, что None не может быть зарегистрирован. Это исключение к
утверждению выше о том, что реестр не заботиться о том, что регистрируется.r…r}r(hjhjubaubeubeubh%h)r}r(hhhh h}r (h
]h	]h]r!Xнулевые адаптерыr"ah]r#jWah
]uhMqhhhUhh,h3]r$(h5)r%}r&(hhhh8h}r'(h	]h
]h:jYh
]h]h]uhMqhhhj^hjh3]r(h>XНулевые адаптерыr)…r*}r+(hj^hj%ubaubha)r,}r-(hhhhdh}r.(h
]h	]h]h]h
]uhMshhhXWВы можете также адаптировать без спецификации::r/hjh3]r0h>XVВы можете также адаптировать без спецификации:r1…r2}r3(hXVВы можете также адаптировать без спецификации:hj,ubaubjë)r4}r5(hhhjîh}r6(h	]h
]jðjñh
]h]h]uhMuhhhXk>>> registry.register([], IP2, '', 2)
>>> registry.lookup([], IP2, '')
2
>>> registry.lookup([], IP1, '')
2hjh3]r7h>Xk>>> registry.register([], IP2, '', 2)
>>> registry.lookup([], IP2, '')
2
>>> registry.lookup([], IP1, '')
2r8…r9}r:(hUhj4ubaubh)r;}r<(hhhh h}r=(h
]h	]h]r>XBперечисление именованных адаптеровr?ah]r@jnah
]uhM|hhhUhjh3]rA(h5)rB}rC(hhhh8h}rD(h	]h
]h:jph
]h]h]uhM|hhhjuhj;h3]rEh>XBПеречисление именованных адаптеровrF…rG}rH(hjuhjBubaubha)rI}rJ(hhhhdh}rK(h
]h	]h]h]h
]uhM~hhhXÈАдаптеры имеют имена. Иногда это полезно для получения всех именованных
адаптеров для заданного интерфейса::hj;h3]rLh>XÇАдаптеры имеют имена. Иногда это полезно для получения всех именованных
адаптеров для заданного интерфейса:rM…rN}rO(hXÇАдаптеры имеют имена. Иногда это полезно для получения всех именованных
адаптеров для заданного интерфейса:hjIubaubjë)rP}rQ(hhhjîh}rR(h	]h
]jðjñh
]h]h]uhMhhhX€>>> adapters = list(registry.lookupAll([IR1], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', 11), (u'bob', "Bob's 12")]hj;h3]rSh>X€>>> adapters = list(registry.lookupAll([IR1], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', 11), (u'bob', "Bob's 12")]rT…rU}rV(hUhjPubaubha)rW}rX(hhhhdh}rY(h
]h	]h]h]h
]uhM…hhhXNЭто работает также и для мульти-адаптеров::rZhj;h3]r[h>XMЭто работает также и для мульти-адаптеров:r\…r]}r^(hXMЭто работает также и для мульти-адаптеров:hjWubaubjë)r_}r`(hhhjîh}ra(h	]h
]jðjñh
]h]h]uhM‡hhhXÉ>>> registry.register([IR1, IQ2], IP2, 'bob', '1q2 for bob')
>>> adapters = list(registry.lookupAll([IR2, IQ2], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', '1q22'), (u'bob', '1q2 for bob')]hj;h3]rbh>XÉ>>> registry.register([IR1, IQ2], IP2, 'bob', '1q2 for bob')
>>> adapters = list(registry.lookupAll([IR2, IQ2], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', '1q22'), (u'bob', '1q2 for bob')]rc…rd}re(hUhj_ubaubha)rf}rg(hhhhdh}rh(h
]h	]h]h]h
]uhMŒhhhX6И даже для нулевых адаптеров::rihj;h3]rjh>X5И даже для нулевых адаптеров:rk…rl}rm(hX5И даже для нулевых адаптеров:hjfubaubjë)rn}ro(hhhjîh}rp(h	]h
]jðjñh
]h]h]uhMŽhhhXœ>>> registry.register([], IP2, 'bob', 3)
>>> adapters = list(registry.lookupAll([], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', 2), (u'bob', 3)]hj;h3]rqh>Xœ>>> registry.register([], IP2, 'bob', 3)
>>> adapters = list(registry.lookupAll([], IP1))
>>> adapters.sort()
>>> assert adapters == [(u'', 2), (u'bob', 3)]rr…rs}rt(hUhjnubaubeubeubh)ru}rv(hhhh h}rw(h
]h	]h]rxXподпискиryah]rzjah
]uhM”hhhUhh,h3]r{(h5)r|}r}(hhhh8h}r~(h	]h
]h:jƒh
]h]h]uhM”hhhjˆhjuh3]rh>XПодпискиr€…r}r‚(hjˆhj|ubaubha)rƒ}r„(hhhhdh}r…(h
]h	]h]h]h
]uhM–hhhXОбычно мы хотим запросить объект который наиболее близко соответствует
спецификации. Иногда мы хотим получить все объекты которые соответствуют
какой-либо спецификации. Мы используем подписки для этого. Мы подписываем
объекты для спецификаций и затем позже находим все подписанные объекты::hjuh3]r†h>XОбычно мы хотим запросить объект который наиболее близко соответствует
спецификации. Иногда мы хотим получить все объекты которые соответствуют
какой-либо спецификации. Мы используем подписки для этого. Мы подписываем
объекты для спецификаций и затем позже находим все подписанные объекты:r‡…rˆ}r‰(hXОбычно мы хотим запросить объект который наиболее близко соответствует
спецификации. Иногда мы хотим получить все объекты которые соответствуют
какой-либо спецификации. Мы используем подписки для этого. Мы подписываем
объекты для спецификаций и затем позже находим все подписанные объекты:hjƒubaubjë)rŠ}r‹(hhhjîh}rŒ(h	]h
]jðjñh
]h]h]uhM›hhhX`>>> registry.subscribe([IR1], IP2, 'sub12 1')
>>> registry.subscriptions([IR1], IP2)
['sub12 1']hjuh3]rh>X`>>> registry.subscribe([IR1], IP2, 'sub12 1')
>>> registry.subscriptions([IR1], IP2)
['sub12 1']rŽ…r}r(hUhjŠubaubha)r‘}r’(hhhhdh}r“(h
]h	]h]h]h
]uhMŸhhhX|Заметьте, что в отличие от обычных адаптеров подписки не имеют имен.r”hjuh3]r•h>X|Заметьте, что в отличие от обычных адаптеров подписки не имеют имен.r–…r—}r˜(hj”hj‘ubaubha)r™}rš(hhhhdh}r›(h
]h	]h]h]h
]uhM¡hhhXsВы можете иметь несколько подписчиков для одной спецификации::rœhjuh3]rh>XrВы можете иметь несколько подписчиков для одной спецификации:rž…rŸ}r (hXrВы можете иметь несколько подписчиков для одной спецификации:hj™ubaubjë)r¡}r¢(hhhjîh}r£(h	]h
]jðjñh
]h]h]uhM£hhhXk>>> registry.subscribe([IR1], IP2, 'sub12 2')
>>> registry.subscriptions([IR1], IP2)
['sub12 1', 'sub12 2']hjuh3]r¤h>Xk>>> registry.subscribe([IR1], IP2, 'sub12 2')
>>> registry.subscriptions([IR1], IP2)
['sub12 1', 'sub12 2']r¥…r¦}r§(hUhj¡ubaubha)r¨}r©(hhhhdh}rª(h
]h	]h]h]h
]uhM§hhhXÔЕсли подписчики зарегистрированы для одних и тех же требуемых интерфейсов, они
возвращаются в порядке определения.r«hjuh3]r¬h>XÔЕсли подписчики зарегистрированы для одних и тех же требуемых интерфейсов, они
возвращаются в порядке определения.r­…r®}r¯(hj«hj¨ubaubha)r°}r±(hhhhdh}r²(h
]h	]h]h]h
]uhMªhhhXŠВы можете зарегистрировать подписчики для всех спецификаций используя None::r³hjuh3]r´h>X‰Вы можете зарегистрировать подписчики для всех спецификаций используя None:rµ…r¶}r·(hX‰Вы можете зарегистрировать подписчики для всех спецификаций используя None:hj°ubaubjë)r¸}r¹(hhhjîh}rº(h	]h
]jðjñh
]h]h]uhM¬hhhXs>>> registry.subscribe([None], IP1, 'sub_1')
>>> registry.subscriptions([IR2], IP1)
['sub_1', 'sub12 1', 'sub12 2']hjuh3]r»h>Xs>>> registry.subscribe([None], IP1, 'sub_1')
>>> registry.subscriptions([IR2], IP1)
['sub_1', 'sub12 1', 'sub12 2']r¼…r½}r¾(hUhj¸ubaubha)r¿}rÀ(hhhhdh}rÁ(h
]h	]h]h]h
]uhM°hhhXDЗаметьте, что новый подписчик возвращается первым. Подписчики определенные
для менее общих требуемых интерфейсов возвращаются перед подписчиками
для более общих интерфейсов.rÂhjuh3]rÃh>XDЗаметьте, что новый подписчик возвращается первым. Подписчики определенные
для менее общих требуемых интерфейсов возвращаются перед подписчиками
для более общих интерфейсов.rÄ…rÅ}rÆ(hjÂhj¿ubaubha)rÇ}rÈ(hhhhdh}rÉ(h
]h	]h]h]h
]uhM´hhhXŒПодписки могут смешиваться между несколькими совместимыми спецификациями::rÊhjuh3]rËh>X‹Подписки могут смешиваться между несколькими совместимыми спецификациями:rÌ…rÍ}rÎ(hX‹Подписки могут смешиваться между несколькими совместимыми спецификациями:hjÇubaubjë)rÏ}rÐ(hhhjîh}rÑ(h	]h
]jðjñh
]h]h]uhM¶hhhXŽ>>> 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']hjuh3]rÒh>XŽ>>> 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']rÓ…rÔ}rÕ(hUhjÏubaubha)rÖ}r×(hhhhdh}rØ(h
]h	]h]h]h
]uhMÁhhhXkПодписки могут существовать для нескольких спецификаций::rÙhjuh3]rÚh>XjПодписки могут существовать для нескольких спецификаций:rÛ…rÜ}rÝ(hXjПодписки могут существовать для нескольких спецификаций:hjÖubaubjë)rÞ}rß(hhhjîh}rà(h	]h
]jðjñh
]h]h]uhMÃhhhXf>>> registry.subscribe([IR1, IQ], IP2, 'sub1q2')
>>> registry.subscriptions([IR1, IQ], IP2)
['sub1q2']hjuh3]ráh>Xf>>> registry.subscribe([IR1, IQ], IP2, 'sub1q2')
>>> registry.subscriptions([IR1, IQ], IP2)
['sub1q2']r⅁rã}rä(hUhjÞubaubha)rå}ræ(hhhhdh}rç(h
]h	]h]h]h
]uhMÇhhhXКак и с одиночными подписчиками и адаптерами без подписок, вы можете определить
None для первого требуемого интерфейса, что бы задать значение по умолчанию::hjuh3]rèh>XКак и с одиночными подписчиками и адаптерами без подписок, вы можете определить
None для первого требуемого интерфейса, что бы задать значение по умолчанию:r酁rê}rë(hXКак и с одиночными подписчиками и адаптерами без подписок, вы можете определить
None для первого требуемого интерфейса, что бы задать значение по умолчанию:hjåubaubjë)rì}rí(hhhjîh}rî(h	]h
]jðjñh
]h]h]uhMÊhhhX¦>>> registry.subscribe([None, IQ], IP2, 'sub_q2')
>>> registry.subscriptions([IS, IQ], IP2)
['sub_q2']
>>> registry.subscriptions([IR1, IQ], IP2)
['sub_q2', 'sub1q2']hjuh3]rïh>X¦>>> registry.subscribe([None, IQ], IP2, 'sub_q2')
>>> registry.subscriptions([IS, IQ], IP2)
['sub_q2']
>>> registry.subscriptions([IR1, IQ], IP2)
['sub_q2', 'sub1q2']rð…rñ}rò(hUhjìubaubha)ró}rô(hhhhdh}rõ(h
]h	]h]h]h
]uhMÐhhhX€Вы можете создать подписки которые независимы от любых спецификаций::röhjuh3]r÷h>XВы можете создать подписки которые независимы от любых спецификаций:rø…rù}rú(hXВы можете создать подписки которые независимы от любых спецификаций:hjóubaubjë)rû}rü(hhhjîh}rý(h	]h
]jðjñh
]h]h]uhMÒhhhX>>> 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']hjuh3]rþh>X>>> 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']rÿ…r}r(hUhjûubaubh)r}r(hhhh h}r(h
]h	]h]rX>удаление регистрации подписчиковrah]rj˜ah
]uhMßhhhUhjuh3]r(h5)r	}r
(hhhh8h}r(h	]h
]h:jšh
]h]h]uhMßhhhjŸhjh3]rh>X>Удаление регистрации подписчиковr
…r}r(hjŸhj	ubaubha)r}r(hhhhdh}r(h
]h	]h]h]h
]uhMáhhhXíМы можем удалять регистрацию подписчиков. При удалении регистрации подписчика
мы можем удалить регистрацию заданного адаптера::hjh3]rh>XìМы можем удалять регистрацию подписчиков. При удалении регистрации подписчика
мы можем удалить регистрацию заданного адаптера:r…r}r(hXìМы можем удалять регистрацию подписчиков. При удалении регистрации подписчика
мы можем удалить регистрацию заданного адаптера:hjubaubjë)r}r(hhhjîh}r(h	]h
]jðjñh
]h]h]uhMähhhXt>>> registry.unsubscribe([IR1], IP1, 'sub11')
>>> registry.subscriptions([IR1], IP1)
['sub_1', 'sub12 1', 'sub12 2']hjh3]rh>Xt>>> registry.unsubscribe([IR1], IP1, 'sub11')
>>> registry.subscriptions([IR1], IP1)
['sub_1', 'sub12 1', 'sub12 2']r…r}r(hUhjubaubha)r}r(hhhhdh}r (h
]h	]h]h]h
]uhMèhhhXâЕсли мы не задаем никакого значения тогда подписки будут удалены для всех
подписчиков совпадающих с заданным интерфейсом::hjh3]r!h>XáЕсли мы не задаем никакого значения тогда подписки будут удалены для всех
подписчиков совпадающих с заданным интерфейсом:r"…r#}r$(hXáЕсли мы не задаем никакого значения тогда подписки будут удалены для всех
подписчиков совпадающих с заданным интерфейсом:hjubaubjë)r%}r&(hhhjîh}r'(h	]h
]jðjñh
]h]h]uhMëhhhXU>>> registry.unsubscribe([IR1], IP2)
>>> registry.subscriptions([IR1], IP1)
['sub_1']hjh3]r(h>XU>>> registry.unsubscribe([IR1], IP2)
>>> registry.subscriptions([IR1], IP1)
['sub_1']r)…r*}r+(hUhj%ubaubeubh)r,}r-(hhhh h}r.(h
]h	]h]r/X!адаптеры подпискиr0ah]r1j«ah
]uhMðhhhUhjuh3]r2(h5)r3}r4(hhhh8h}r5(h	]h
]h:j­h
]h]h]uhMðhhhj²hj,h3]r6h>X!Адаптеры подпискиr7…r8}r9(hj²hj3ubaubha)r:}r;(hhhhdh}r<(h
]h	]h]h]h
]uhMòhhhX^Обычно мы регистрируем фабрики для адаптеров которые затем позволяют нам
вычислять адаптеры, но с подписками мы получаем несколько адаптеров. Это пример
подписчика для нескольких объектов::hj,h3]r=h>X]Обычно мы регистрируем фабрики для адаптеров которые затем позволяют нам
вычислять адаптеры, но с подписками мы получаем несколько адаптеров. Это пример
подписчика для нескольких объектов:r>…r?}r@(hX]Обычно мы регистрируем фабрики для адаптеров которые затем позволяют нам
вычислять адаптеры, но с подписками мы получаем несколько адаптеров. Это пример
подписчика для нескольких объектов:hj:ubaubjë)rA}rB(hhhjîh}rC(h	]h
]jðjñh
]h]h]uhMöhhhXL>>> 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]hj,h3]rDh>XL>>> 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]rE…rF}rG(hUhjAubaubha)rH}rI(hhhhdh}rJ(h
]h	]h]h]h
]uhMhhhX`подписчики фабрик адаптеров не могут возвращать None::rKhj,h3]rLh>X_подписчики фабрик адаптеров не могут возвращать None:rM…rN}rO(hX_подписчики фабрик адаптеров не могут возвращать None:hjHubaubjë)rP}rQ(hhhjîh}rR(h	]h
]jðjñh
]h]h]uhMhhhX™>>> def M3(x, y):
...     return None

>>> registry.subscribe([IR, IQ], IM, M3)
>>> subscribers = registry.subscribers((x, q), IM)
>>> len(subscribers)
2hj,h3]rSh>X™>>> def M3(x, y):
...     return None

>>> registry.subscribe([IR, IQ], IM, M3)
>>> subscribers = registry.subscribers((x, q), IM)
>>> len(subscribers)
2rT…rU}rV(hUhjPubaubeubh)rW}rX(hhhh h}rY(h
]h	]h]rZXобработчикиr[ah]r\j¾ah
]uhMhhhUhjuh3]r](h5)r^}r_(hhhh8h}r`(h	]h
]h:jÀh
]h]h]uhMhhhjÅhjWh3]rah>XОбработчикиrb…rc}rd(hjÅhj^ubaubha)re}rf(hhhhdh}rg(h
]h	]h]h]h
]uhMhhhX^Обработчик - это подписанная фабрика которая не возвращает нормального
значения. Она возвращает None. Обработчик отличается от адаптеров тем, что он
делает всю работу когда вызывается фабрика.rhhjWh3]rih>X^Обработчик - это подписанная фабрика которая не возвращает нормального
значения. Она возвращает None. Обработчик отличается от адаптеров тем, что он
делает всю работу когда вызывается фабрика.rj…rk}rl(hjhhjeubaubha)rm}rn(hhhhdh}ro(h
]h	]h]h]h
]uhMhhhX›Для регистрации обработчика надо просто передать None как предоставляемый
интерфейс::hjWh3]rph>XšДля регистрации обработчика надо просто передать None как предоставляемый
интерфейс:rq…rr}rs(hXšДля регистрации обработчика надо просто передать None как предоставляемый
интерфейс:hjmubaubjë)rt}ru(hhhjîh}rv(h	]h
]jðjñh
]h]h]uhMhhhXž>>> def handler(event):
...     print 'handler', event

>>> registry.subscribe([IR1], None, handler)
>>> registry.subscriptions([IR1], None) == [handler]
TruehjWh3]rwh>Xž>>> def handler(event):
...     print 'handler', event

>>> registry.subscribe([IR1], None, handler)
>>> registry.subscriptions([IR1], None) == [handler]
Truerx…ry}rz(hUhjtubaubeubeubeubh3]r{(h5)r|}r}(hhhh8h}r~(h	]h
]h:jh
]h]h]uhM'hhhj"hh%h3]rh>XМульти-адаптерыr€…r}r‚(hj"hj|ubaubha)rƒ}r„(hhhhdh}r…(h
]h	]h]h]h
]uhM)hhhXXВы можете адаптировать несколько спецификаций::r†hh%h3]r‡h>XWВы можете адаптировать несколько спецификаций:rˆ…r‰}rŠ(hXWВы можете адаптировать несколько спецификаций:hjƒubaubjë)r‹}rŒ(hhhjîh}r(h	]h
]jðjñh
]h]h]uhM+hhhXŸ>>> 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'hh%h3]rŽh>XŸ>>> 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'r…r}r‘(hUhj‹ubaubh)r’}r“(hhhh h}r”(h
]h	]h]r•Xмульти-адаптацияr–ah]r—j2ah
]uhM@hhhUhh%h3]r˜(h5)r™}rš(hhhh8h}r›(h	]h
]h:j4h
]h]h]uhM@hhhj9hj’h3]rœh>XМульти-адаптацияr…rž}rŸ(hj9hj™ubaubha)r }r¡(hhhhdh}r¢(h
]h	]h]h]h
]uhMBhhhXPВы можете адаптировать несколько объектов::r£hj’h3]r¤h>XOВы можете адаптировать несколько объектов:r¥…r¦}r§(hXOВы можете адаптировать несколько объектов:hj ubaubjë)r¨}r©(hhhjîh}rª(h	]h
]jðjñh
]h]h]uhMDhhhX2>>> class Q:
...     zope.interface.implements(IQ)hj’h3]r«h>X2>>> class Q:
...     zope.interface.implements(IQ)r¬…r­}r®(hUhj¨ubaubha)r¯}r°(hhhhdh}r±(h
]h	]h]h]h
]uhMGhhhX•Как и с одиночными адаптерами, мы регистрируем фабрику которая возвращает
класс::hj’h3]r²h>X”Как и с одиночными адаптерами, мы регистрируем фабрику которая возвращает
класс:r³…r´}rµ(hX”Как и с одиночными адаптерами, мы регистрируем фабрику которая возвращает
класс:hj¯ubaubjë)r¶}r·(hhhjîh}r¸(h	]h
]jðjñh
]h]h]uhMJhhhXÖ>>> 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)hj’h3]r¹h>XÖ>>> 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)rº…r»}r¼(hUhj¶ubaubha)r½}r¾(hhhhdh}r¿(h
]h	]h]h]h
]uhMRhhhXoИ затем мы можем вызвать `queryMultiAdapter` для вычисления адаптера::rÀhj’h3]rÁ(h>X-И затем мы можем вызвать rÂ…rÃ}rÄ(hX-И затем мы можем вызвать hj½ubj)rÅ}rÆ(hX`queryMultiAdapter`hj"h}rÇ(h
]h	]h]h]h
]uhj½h3]rÈh>XqueryMultiAdapterrÉ…rÊ}rË(hUhjÅubaubh>X. для вычисления адаптера:rÌ…rÍ}rÎ(hX. для вычисления адаптера:hj½ubeubjë)rÏ}rÐ(hhhjîh}rÑ(h	]h
]jðjñh
]h]h]uhMThhhXv>>> q = Q()
>>> m = registry.queryMultiAdapter((x, q), IM)
>>> m.__class__.__name__
'M'
>>> m.x is x and m.q is q
Truehj’h3]rÒh>Xv>>> q = Q()
>>> m = registry.queryMultiAdapter((x, q), IM)
>>> m.__class__.__name__
'M'
>>> m.x is x and m.q is q
TruerÓ…rÔ}rÕ(hUhjÏubaubha)rÖ}r×(hhhhdh}rØ(h
]h	]h]h]h
]uhM[hhhXIи, конечно, мы можем использовать имена::rÙhj’h3]rÚh>XHи, конечно, мы можем использовать имена:rÛ…rÜ}rÝ(hXHи, конечно, мы можем использовать имена:hjÖubaubjë)rÞ}rß(hhhjîh}rà(h	]h
]jðjñh
]h]h]uhM]hhhX¿>>> 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
Truehj’h3]ráh>X¿>>> 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
Truer⅁rã}rä(hUhjÞubaubeubheubjKh3]rå(h5)ræ}rç(hhhh8h}rè(h	]h
]h:jFh
]h]h]uhMghhhjKhhh3]réh>X(Адаптеры по умолчаниюrꅁrë}rì(hjKhjæubaubha)rí}rî(hhhhdh}rï(h
]h	]h]h]h
]uhMihhhXÏКак и для одиночных адаптеров вы можете определить адаптер по умолчанию передав
None вместо *первой* спецификации::hhh3]rð(h>X¦Как и для одиночных адаптеров вы можете определить адаптер по умолчанию передав
None вместо rñ…rò}ró(hX¦Как и для одиночных адаптеров вы можете определить адаптер по умолчанию передав
None вместо hjíubcdocutils.nodes
emphasis
rô)rõ}rö(hX*первой*hUemphasisr÷h}rø(h
]h	]h]h]h
]uhjíh3]rùh>Xпервойrú…rû}rü(hUhjõubaubh>X спецификации:rý…rþ}rÿ(hX спецификации:hjíubeubjë)r}r(hhhjîh}r(h	]h
]jðjñh
]h]h]uhMlhhhX\>>> registry.register([None, IQ], IP2, '', 'q2')
>>> registry.lookup([IS, IQ], IP2, '')
'q2'hhh3]rh>X\>>> registry.register([None, IQ], IP2, '', 'q2')
>>> registry.lookup([IS, IQ], IP2, '')
'q2'r…r}r(hUhjubaubeubh3]rha)r}r	(hUhhdh}r
(h
]h	]h]h]h
]uhhh3]rh>XKDuplicate implicit target name: "адаптеры по умолчанию".r…r
}r(hUhjubaubaubaU
decorationrNU	citationsr]rhUU	nametypesr}r(jNj[Nj0Nh0NjNjýNj?NjäNjÀNj"Nj–NjÅNX(адаптеры по умолчаниюrNhHNjyNjÚNh)NjáNuUsettingsr(cdocutils.frontend
Values
ror}r(Upep_referencesrNUoutput_encoding_error_handlerrUstrictrU
halt_levelrKU
source_urlrNU
dump_settingsrNUdoctitle_xformr‰Udump_pseudo_xmlr NU	tab_widthr!KU	id_prefixr"Uh8NUembed_stylesheetr#‰U
docinfo_xformr$KUfootnote_backlinksr%KUerror_encodingr&UUTF-8r'Uauto_id_prefixr(Uidr)U
language_coder*Uenr+U	datestampr,NUdump_transformsr-NUoutput_encodingr.Uutf-8r/Uexit_status_levelr0KUstrict_visitorr1NU_disable_configr2NUfile_insertion_enabledr3ˆU	tracebackr4ˆUrecord_dependenciesr5NUstrip_commentsr6NUdebugr7NU	generatorr8NUgettext_compactr9ˆUenvr:NU
strip_classesr;NUpep_file_url_templater<Upep-%04dr=Uinput_encoding_error_handlerr>jUexpose_internalsr?NUrfc_referencesr@NU
toc_backlinksrAUentryrBUtrim_footnote_reference_spacerC‰U_sourcerDhUwarning_streamrENUinput_encodingrFU	utf-8-sigrGUsectsubtitle_xformrH‰Usource_linkrINUconfigrJNU
sectnum_xformrKKUerror_encoding_error_handlerrLUbackslashreplacerMU
_config_filesrN]Udump_internalsrONUsmart_quotesrP‰Ucloak_email_addressesrQˆUraw_enabledrRKUstrip_elements_with_classesrSNUpep_base_urlrTU https://www.python.org/dev/peps/rUUreport_levelrVKUrfc_base_urlrWUhttps://tools.ietf.org/html/rXU_destinationrYNUsyntax_highlightrZUlongr[ubUautofootnote_refsr\]r]U
footnote_refsr^}r_Uid_startr`K$U
citation_refsra}rbUsymbol_footnote_refsrc]rdUtransform_messagesre]rfU	footnotesrg]rhUnameidsri}rj(jj˜j[j¾j0j«h0h2jh½jýj	j?jnjähªjÀh—j"jWj–j2jÅhãjNhHhJjyjjÚh€h)h+jáhöuUrefnamesrk}rlUtransformerrmNUidsrn}ro(hªjàhJhCjYjTjpjkh;hhh‚h}j­j¨jÀj»jWjjnj;j2j’hhj«j,j¾jWjjuj˜jjƒj~jšj•hÒhÍh¿hºh¬h§h™h”jjjjhøhóhåhàjFjBj4j/hãjÁhöjÝh½jühÐjˆh€jÖh—j¼h2h,j	jùh+h%uUsymbol_footnotesrp]rqhhUindirect_targetsrr]rsUsubstitution_namesrt}ruUcurrent_linervNUsubstitution_defsrw}rxUsymbol_footnote_startryKUautofootnote_startrzKU
autofootnotesr{]r|h3]r}h,aUcurrent_sourcer~NUrefidsr}r€ub.