get multi adapter を使用して iterface を検索するコードがあります。マルチアダプターに渡される要素のメンバーの 1 つは、そのインターフェイスを提供していますが、要素自体は提供していません。
マルチアダプターに渡されるものを制御することはできませんが、要素の 1 つを含む要素を制御することはできます。どうすればマークできますか? そこに役立つ可能性のあるものがあることをマルチアダプターに通知するには、provideAdapterFactory(cls, interface) のようなものがありますか?
コード例:
宣言
class ImplementsInterface(object):
implements(IMarker)
class Parent(object)
child = ImplementsInterface()
調べる
some_members = zope.component.getMultiAdapter(((Parent()), IMarker)
ここで、このようなコードを実行すると、ComponentLookupErrorが生成されます。同時に、ルックアップ コードを変更することも、マルチ アダプターの場合も、親が既に別のインターフェイスを実装しているため、親に 'implements(IMarker) を割り当てることもできません。他の多くのものを壊します。
アップデート:
Chapter 6.1 Multi Adapterから理解できる説明を見つけたと思います
更新 2: 単体テスト コードで zca を正しく初期化していないと思います。スニペットを次に示します。
import unittest2 as unittest
from zope.traversing.adapters import DefaultTraversable
from z3c.form.testing import TestRequest
from z3c.form import testing, field
from zope import component
class TestFunctionalForm(unittest.TestCase):
def setUp(self):
testing.setUp(self)
component.provideAdapter(field.FieldWidgets)
component.provideAdapter(DefaultTraversable, [None])
self.context = self.globs['root']
def tearDown(self):
testing.tearDown(self)