如何从组件注册表获取所有已注册的浏览器:资源和浏览器:resourceDirectory?
我在不同的地方试图发现zcml指令浏览器创建了哪种组件:资源并找到了带有registerAdapter调用的Products.Five.browser.metaconfigure:
handler('registerAdapter', factory, (layer,), Interface, name, _context.info)
这意味着它将注册一个需要(layer,)并提供Interface的适配器,但是调用以下代码不起作用(它返回一个不是浏览器资源的组件):
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
zope.component.getAdapters((IDefaultBrowserLayer,), Interface)
我不确定,但似乎getAdapters需要一个实例.我不想查询zope.component但要获取已注册的适配器.
我在zope.interface.interfaces中找到了一个方法lookupAll(必需,提供),看起来像我想要的但我找不到它的实现位置所以我不知道如何调用它.
最佳答案 zope.component.getAdapters()确实需要传递一个实例.
zope.interface.registry.Components.getAdapters()
method电话:
list(map(providedBy, objects))
其中provideBy是zope.interface.declarations.providedBy(). IDefaultBrowserLayer提供的所有内容都是.. zope.interface.IInterface和zope.interface.ISpecification.
您需要传入一个提供IDefaultBrowserLayer的虚拟对象,而不是直接传入接口.
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
import zope.component
import zope.interface
class dummy(object):
zope.interface.classProvides(IDefaultBrowserLayer)
zope.component.getAdapters((dummy,), zope.interface.Interface)