[Zodb-checkins] CVS: Packages/ZODB - Connection.py:1.98.4.11.2.1
DB.py:1.53.2.5.22.1 ZApplication.py:1.13.88.1 utils.py:1.17.4.4.22.1
Tres Seaver
tseaver at palladion.com
Sat May 28 20:42:23 EDT 2005
Update of /cvs-repository/Packages/ZODB
In directory cvs.zope.org:/tmp/cvs-serv32028/lib/python/ZODB
Modified Files:
Tag: tseaver-hasattr_geddon-branch
Connection.py DB.py ZApplication.py utils.py
Log Message:
- Removed all uses of the 'hasattr' builtin from the core, where
the object being tested derives (or might) from Persistent.
XXX: currently, this branch imports a 'safe_hasattr' from ZODB.utils,
which adds a dependency on ZODB for some packages; we probably
need a better location, and perhas a C implementation?
=== Packages/ZODB/Connection.py 1.98.4.11 => 1.98.4.11.2.1 ===
--- Packages/ZODB/Connection.py:1.98.4.11 Mon May 2 16:30:27 2005
+++ Packages/ZODB/Connection.py Sat May 28 20:41:37 2005
@@ -32,6 +32,7 @@
from ConflictResolution import ResolvedSerial
from Transaction import Transaction, get_transaction
from ZODB.utils import oid_repr
+from ZODB.utils import safe_hasattr
global_code_timestamp = 0
@@ -182,7 +183,7 @@
klass=self._db._classFactory(self, module, name)
if (args is None or
- not args and not hasattr(klass,'__getinitargs__')):
+ not args and not safe_hasattr(klass,'__getinitargs__')):
object=klass.__basicnew__()
else:
object = klass(*args)
@@ -375,7 +376,7 @@
# def persistent_id(object,
# self=self,
# stackup=stackup, new_oid=self.new_oid):
- # if (not hasattr(object, '_p_oid') or
+ # if (not safe_hasattr(object, '_p_oid') or
# type(object) is ClassType): return None
#
# oid=object._p_oid
@@ -390,7 +391,7 @@
#
# if klass is ExtensionKlass: return oid
#
- # if hasattr(klass, '__getinitargs__'): return oid
+ # if safe_hasattr(klass, '__getinitargs__'): return oid
#
# module=getattr(klass,'__module__','')
# if module: klass=module, klass.__name__
@@ -421,7 +422,8 @@
self._creating.append(oid)
else:
#XXX We should never get here
- if invalid(oid) and not hasattr(object, '_p_resolveConflict'):
+ if (invalid(oid)
+ and not safe_hasattr(object, '_p_resolveConflict')):
raise ConflictError(object=object)
self._modified.append(oid)
@@ -435,7 +437,7 @@
args=object.__name__, object.__bases__, dict
state=None
else:
- if hasattr(klass, '__getinitargs__'):
+ if safe_hasattr(klass, '__getinitargs__'):
args = object.__getinitargs__()
len(args) # XXX Assert it's a sequence
else:
@@ -459,7 +461,7 @@
try: cache[oid]=object
except:
# Dang, I bet its wrapped:
- if hasattr(object, 'aq_base'):
+ if safe_hasattr(object, 'aq_base'):
cache[oid]=object.aq_base
else:
raise
=== Packages/ZODB/DB.py 1.53.2.5 => 1.53.2.5.22.1 ===
--- Packages/ZODB/DB.py:1.53.2.5 Fri May 21 19:06:03 2004
+++ Packages/ZODB/DB.py Sat May 28 20:41:37 2005
@@ -23,6 +23,7 @@
from referencesf import referencesf
from time import time, ctime
from zLOG import LOG, ERROR
+from ZODB.utils import safe_hasattr
from types import StringType
@@ -79,7 +80,8 @@
# Setup storage
self._storage=storage
storage.registerDB(self, None)
- if not hasattr(storage,'tpc_vote'): storage.tpc_vote=lambda *args: None
+ if not hasattr(storage,'tpc_vote'):
+ storage.tpc_vote=lambda *args: None
try:
storage.load('\0\0\0\0\0\0\0\0','')
except KeyError:
@@ -206,7 +208,7 @@
cn = conn_no[0]
for oid, ob in con._cache_items():
id = ''
- if hasattr(ob, '__dict__'):
+ if safe_hasattr(ob, '__dict__'):
d = ob.__dict__
if d.has_key('id'):
id = d['id']
=== Packages/ZODB/ZApplication.py 1.13 => 1.13.88.1 ===
--- Packages/ZODB/ZApplication.py:1.13 Tue Apr 8 14:48:22 2003
+++ Packages/ZODB/ZApplication.py Sat May 28 20:41:37 2005
@@ -18,6 +18,8 @@
"""
__version__='$Revision$'[11:-2]
+from ZODB.utils import safe_hasattr
+
StringType=type('')
connection_open_hooks = []
@@ -60,10 +62,11 @@
v=conn.root()[aname]
if name is not None:
- if hasattr(v, '__bobo_traverse__'):
+ if safe_hasattr(v, '__bobo_traverse__'):
return v.__bobo_traverse__(REQUEST, name)
- if hasattr(v,name): return getattr(v,name)
+ if safe_hasattr(v,name):
+ return getattr(v,name)
return v[name]
return v
=== Packages/ZODB/utils.py 1.17.4.4 => 1.17.4.4.22.1 ===
--- Packages/ZODB/utils.py:1.17.4.4 Sat Sep 4 00:45:03 2004
+++ Packages/ZODB/utils.py Sat May 28 20:41:37 2005
@@ -113,3 +113,13 @@
if isinstance(tid, StringType) and len(tid) == 8:
result = "%s %s" % (result, TimeStamp.TimeStamp(tid))
return result
+
+def safe_hasattr(obj, name, _marker=object()):
+ """Make sure we don't mask exceptions like hasattr().
+
+ We don't want exceptions other than AttributeError to be masked,
+ since that too often masks other programming errors.
+ Three-argument getattr() doesn't mask those, so we use that to
+ implement our own hasattr() replacement.
+ """
+ return getattr(obj, name, _marker) is not _marker
More information about the Zodb-checkins
mailing list