[Zope-Checkins] CVS: ZODB4/Interface - Implements.py:1.4

Jeremy Hylton jeremy@zope.com
Wed, 9 Oct 2002 18:34:52 -0400


Update of /cvs-repository/ZODB4/Interface
In directory cvs.zope.org:/tmp/cvs-serv28717/Interface

Modified Files:
	Implements.py 
Log Message:
Improvements depending on Python 2.2+ to all PersistentMetaClass to work.

getImplementsOfInstances() should use an isinstance() test rather than
direct type comparisons.  type(Persistent) is a subtype of type but is
not equal to type.

Simplify defintion of ClassTypes: type(object) == type

Avoid hasattr() followed by getattr() of the same object, since this
gets the attribute twice.

Eliminate performance hack default arg in getImplementsOfInstances().



=== ZODB4/Interface/Implements.py 1.3 => 1.4 ===
--- ZODB4/Interface/Implements.py:1.3	Mon Jun 10 19:27:40 2002
+++ ZODB4/Interface/Implements.py	Wed Oct  9 18:34:51 2002
@@ -27,33 +27,34 @@
 # what its class supports.
 CLASS_INTERFACES = 1
 
-ClassTypes = (ClassType, type(object))
+ClassTypes = ClassType, type
 
-_typeImplements={}
+_typeImplements = {}
 
 def getImplements(object):
     t = type(object)
     if t in ClassTypes:
-        if hasattr(object, '__class_implements__'):
-            return object.__class_implements__
-    elif hasattr(object, '__implements__'):
-        return object.__implements__
-
-    return _typeImplements.get(t, None)
+        ci = getattr(object, '__class_implements__', None)
+        if ci is not None:
+            return ci
+    else:
+        impl = getattr(object, '__implements__', None)
+        if impl is not None:
+            return impl
+
+    return _typeImplements.get(t)
 
 
-def getImplementsOfInstances(klass, tiget=_typeImplements.get):
-    if type(klass) in ClassTypes:
-        if hasattr(klass, '__implements__'):
-            return klass.__implements__
-        else:
-            return None
+def getImplementsOfInstances(klass):
+    if isinstance(klass, ClassTypes):
+        return getattr(klass, '__implements__', None)
     else:
-        return tiget(klass, None)
+        return _typeImplements.get(klass)
 
 
 def visitImplements(implements, object, visitor, getInterface=None):
-    """
+    """Call visitor for each interace.
+    
     Visits the interfaces described by an __implements__ attribute,
     invoking the visitor for each interface object.
     If the visitor returns anything true, the loop stops.
@@ -102,7 +103,7 @@
     """Assign a set of interfaces to a Python type such as int, str, tuple,
        list and dict.
     """
-    _typeImplements[type]=interfaces
+    _typeImplements[type] = interfaces
 
 def objectImplements(object, getInterface=None):
     r = []
@@ -120,7 +121,6 @@
     visitImplements(implements, klass, r.append, getInterface)
     return r
 
-
 def _flatten(i, append):
     append(i)
     bases = i.getBases()
@@ -128,7 +128,6 @@
         for b in bases:
             _flatten(b, append)
 
-
 def flattenInterfaces(interfaces, remove_duplicates=1):
     res = []
     for i in interfaces:
@@ -151,7 +150,7 @@
     if check:
         verifyClass(interface, klass, tentative=1)
 
-    old=getattr(klass, '__implements__', None)
+    old = getattr(klass, '__implements__', None)
     if old is None:
         klass.__implements__ = interface
     else: