[Zope-Checkins] CVS: Zope/lib/python/Interface - Util.py:1.7.8.2 __init__.py:1.5.84.1 iclass.py:1.11.8.3
Shane Hathaway
shane@digicool.com
Tue, 7 Aug 2001 18:30:31 -0400
Update of /cvs-repository/Zope/lib/python/Interface
In directory cvs.zope.org:/tmp/cvs-serv11748
Modified Files:
Tag: NR-branch
Util.py __init__.py iclass.py
Log Message:
- Added CLASS_INTERFACES special interface.
- Added a hookable _getInterface() method to Interface.
- Refactored duplicated code.
=== Zope/lib/python/Interface/Util.py 1.7.8.1 => 1.7.8.2 ===
from iclass import Interface, Class, ClassTypes, Base, \
- assertTypeImplements, _typeImplements #uuh..
-from types import FunctionType
+ assertTypeImplements, CLASS_INTERFACES, _typeImplements #uuh..
+from types import FunctionType, StringType
def impliedInterface(klass, __name__=None, __doc__=None):
@@ -23,17 +23,31 @@
for b in klass.__bases__: _ii(b, items)
return items
-def _flatten(object, interfaces, append):
- for i in interfaces:
- if isinstance(i,Interface): append(i)
- else: _flatten(object, i, append)
+def _listInterfaces(object, implements, getInterface, append):
+ if isinstance(implements, Interface):
+ append(implements)
+ elif implements == CLASS_INTERFACES:
+ klass = getattr(object, '__class__', None)
+ if klass is not None:
+ lst = instancesOfObjectImplements(klass, getInterface)
+ for i in lst:
+ append(i)
+ elif type(implements) is StringType:
+ if getInterface is not None:
+ # Look up the interface.
+ real = getInterface(object, implements, None)
+ if real is not None:
+ append(real)
+ else:
+ # A sequence of interfaces.
+ for i in implements:
+ _listInterfaces(object, i, getInterface, append)
-def objectImplements(object, tiget=_typeImplements.get,
- flattenfunc=_flatten):
+def objectImplements(object, getInterface=None,
+ tiget=_typeImplements.get):
"""Return the interfaces implemented by the object
"""
- r=[]
-
+ r = []
t=type(object)
if t in ClassTypes:
if hasattr(object, '__class_implements__'):
@@ -44,20 +58,16 @@
implements=object.__implements__
else:
implements=tiget(t, None)
- if implements is None: return r
-
- if isinstance(implements,Interface): r.append(implements)
- else: flattenfunc(object, implements, r.append)
-
+ if implements is None:
+ return r
+ _listInterfaces(object, implements, getInterface, r.append)
return r
-
-def instancesOfObjectImplements(klass, tiget=_typeImplements.get,
- flattenfunc=_flatten):
+def instancesOfObjectImplements(klass, getInterface=None,
+ tiget=_typeImplements.get):
"""Return the interfaces that instanced implement (by default)
"""
- r=[]
-
+ r = []
if type(klass) in ClassTypes:
if hasattr(klass, '__implements__'):
implements=klass.__implements__
@@ -67,10 +77,7 @@
implements=klass.instancesImplements()
else:
implements=tiget(klass,None)
-
- if implements is not None:
- if isinstance(implements,Interface): r.append(implements)
- else: flattenfunc(None, implements, r.append)
-
+ if implements is None:
+ return r
+ _listInterfaces(klass, implements, getInterface, r.append)
return r
-
=== Zope/lib/python/Interface/__init__.py 1.5 => 1.5.84.1 ===
new=iclass.Interface
InterfaceInterface=iclass.InterfaceInterface
+CLASS_INTERFACES = iclass.CLASS_INTERFACES
# del iclass
from Util import impliedInterface
=== Zope/lib/python/Interface/iclass.py 1.11.8.2 => 1.11.8.3 ===
from Method import Method
from Attr import Attribute
-from types import FunctionType, ClassType
+from types import FunctionType, ClassType, StringType
import Exceptions
from InterfaceBase import InterfaceBase
@@ -27,6 +27,11 @@
ClassTypes = (type(dummy), ClassType)
+# Special value indicating the object supports
+# what its class supports.
+CLASS_INTERFACES = 1
+
+
_typeImplements={}
class Interface(InterfaceBase):
@@ -88,12 +93,9 @@
implements=object.__implements__
else:
implements=tiget(t, None)
- if implements is None: return 0
-
- if isinstance(implements,Interface):
- return implements == self or implements.extends(self)
- else:
- return self.__any(implements)
+ if implements is None:
+ return 0
+ return self._isImplemented(object, implements)
def isImplementedByInstancesOf(self, klass,
tiget=_typeImplements.get):
@@ -108,13 +110,9 @@
implements=klass.instancesImplement()
else:
implements=tiget(klass,None)
-
- if implements is None: return 0
-
- if isinstance(implements,Interface):
- return implements == self or implements.extends(self)
- else:
- return self.__any(implements)
+ if implements is None:
+ return 0
+ return self._isImplemented(klass, implements)
def names(self):
"""Return the attribute names defined by the interface
@@ -146,6 +144,12 @@
return klass
+ def _getInterface(self, ob, name):
+ '''
+ Retrieve a named interface.
+ '''
+ return None
+
def __d(self, dict):
for k, v in self.__attrs.items():
@@ -153,14 +157,25 @@
dict[k]=v
for b in self.__bases__: b.__d(dict)
-
- def __any(self, interfaces):
- for i in interfaces:
- if isinstance(i,Interface):
- if i == self or i.extends(self): return 1
- else:
- if self.__any(i): return 1
+ def _isImplemented(self, object, implements):
+ if isinstance(implements, Interface):
+ return implements == self or implements.extends(self)
+ elif implements == CLASS_INTERFACES:
+ # Include the interfaces implemented by the
+ # class of the object, if any.
+ klass = getattr(object, '__class__', None)
+ if klass is not None:
+ return self.isImplementedByInstancesOf(klass)
+ elif type(implements) is StringType:
+ # Look up the interface.
+ real = self._getInterface(object, implements)
+ if real is not None:
+ append(real)
+ else:
+ for i in implements:
+ if self._isImplemented(object, i):
+ return 1
return 0
def __repr__(self):
@@ -182,8 +197,7 @@
try:
# Figure out what module defined the interface.
# This is how cPython figures out the module of
- # a class, but of course it does it in C, making
- # it more reliable. :-/
+ # a class, but of course it does it in C. :-/
__module__ = currentframe().f_back.f_globals['__name__']
except AttributeError, KeyError:
pass