Je me attends quand je fais une interface IB
Hériter de IA
, puis utilisez interface.providedBy()
pour interroger une instance de B
(qui met en œuvre IB
), je voyais à la fois IA
et IB
dans la liste. Cependant, cela ne semble pas être le cas.Héritage de l'interface Zope: Pourquoi n'apparaît-il pas dans interface.providedBy()?
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))
exécution de ce code produit la sortie suivante:
Does B() provide IA? True
providedBy(B()): [<InterfaceClass __main__.IB>]
Si B()
fournit IA
, comme le montre la première ligne de sortie, pourquoi ne pas IA
apparaissent dans la deuxième ligne de sortie?
MISE À JOUR: J'ai résolu le problème en utilisant la solution de contournement suivante. Je n'avais aucun intérêt à voir les classes du fournisseur, la classe de base (zope.interface.Interface) ou n'importe quel type de doublon dans les résultats, donc j'ai fait ce qui suit.
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)
Merci. Il est regrettable que ce soit un comportement attendu, car le cas de test que j'ai montré semble mener à un résultat incohérent. J'ai ajouté ma propre solution de contournement à la question. – Scramblejams