【问题标题】:Zope interface inheritance: Why doesn't it show up in interface.providedBy()?Zope 接口继承:为什么它没有出现在 interface.providedBy() 中?
【发布时间】:2013-01-04 19:37:43
【问题描述】:

我希望当我创建一个接口IB 继承自IA,然后使用interface.providedBy() 查询B 的实例(实现IB)时,我会看到IA 和@ 987654327@ 在列表中。但是,情况似乎并非如此。

from zope import interface

class IA(interface.Interface):
    pass

class IB(IA): # We inherit from IA
    pass

class B(object):
    interface.implements(IB)

if __name__ == '__main__':
    b = B()
    print 'Does B() provide IA? %s' % IA.providedBy(b)
    print 'providedBy(B()): %s' % list(interface.providedBy(b))

运行此代码会产生以下输出:

Does B() provide IA? True
providedBy(B()): [<InterfaceClass __main__.IB>]

如果B()提供IA,如第一行输出所示,为什么IA没有出现在第二行输出?

更新:我使用以下解决方法解决了这个问题。我对在结果中查看任何提供程序类、基类 (zope.interface.Interface) 或任何类型的重复项不感兴趣,因此我执行了以下操作。

def getAllInterfaces(obj):
    all_ifaces = set()

    def buildSet(ifaces):
        for iface in ifaces:
            if iface != interface.Interface:
                all_ifaces.add(iface)
                buildSet(iface.__bases__)

    buildSet(list(interface.providedBy(obj)))
    return tuple(all_ifaces)

【问题讨论】:

    标签: python zope.interface


    【解决方案1】:

    providedBy 只返回立即提供的接口。获取所有接口的示例见https://github.com/Pylons/substanced/blob/master/substanced/util/init.py#L398

    【讨论】:

    • 谢谢。不幸的是,这是预期的行为,因为我展示的测试用例似乎导致了不一致的结果。我已经为这个问题添加了自己的解决方法。
    【解决方案2】:

    获取所有提供的接口的简写形式如下:

    from zope.interface.declarations import Declaration
    from zope.interface import providedBy
    
    allProvidedInterfaces = list(Declaration(providedBy(b)).flattened())
    

    它基于@chris-mcdonough 的提示和这种方法:https://github.com/Pylons/substanced/blob/a897f4a0518c51b6e093cc5af39fa326f23752c2/substanced/util/init.py#L426

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2016-06-16
      • 2011-02-25
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多