Staging
v0.5.1
v0.5.1
https://github.com/python/cpython
Revision ba756b5a2b3d3d127420805c7aa096abc9eccd7b authored by Benjamin Peterson on 02 April 2008, 02:27:22 UTC, committed by Benjamin Peterson on 02 April 2008, 02:27:22 UTC
........ r62095 | amaury.forgeotdarc | 2008-04-01 17:37:33 -0500 (Tue, 01 Apr 2008) | 5 lines Fix and enable a skipped test: with python 2.6, enumerating bytes yields 1-char strings, not numbers. Don't merge this into the py3k branch. ........ r62099 | amaury.forgeotdarc | 2008-04-01 19:25:14 -0500 (Tue, 01 Apr 2008) | 14 lines Correct the apparent refleak in test_io: When cls is an ABCMeta, every call to isinstance(x, cls) records type(x) in the cls._abc_cache of cls_abc_negative_cache. So we clear these caches at the end of the test. inspect.isabstract() is not the correct test for all ABCs, because there is no @abstractmethod in io.py (why?) isinstance(cls, ABCMeta) would be more exact, but it fails with an infinite recursion. So I used a hack to determine whether a class is an ABCMeta. The true correction would be to turn cls._abc_cache &co into a WeakSet, as py3k does. But classic classes are not weak referenceable... Of course, this change should not be merged into the py3k branch. ........
1 parent b4febc7
Tip revision: ba756b5a2b3d3d127420805c7aa096abc9eccd7b authored by Benjamin Peterson on 02 April 2008, 02:27:22 UTC
Blocked revisions 62095,62099 via svnmerge
Blocked revisions 62095,62099 via svnmerge
Tip revision: ba756b5
anydbm.py
"""Generic interface to all dbm clones.
Instead of
import dbm
d = dbm.open(file, 'w', 0o666)
use
import anydbm
d = anydbm.open(file, 'w')
The returned object is a dbhash, gdbm, dbm or dumbdbm object,
dependent on the type of database being opened (determined by whichdb
module) in the case of an existing dbm. If the dbm does not exist and
the create or new flag ('c' or 'n') was specified, the dbm type will
be determined by the availability of the modules (tested in the above
order).
It has the following interface (key and data are strings):
d[key] = data # store data at key (may override data at
# existing key)
data = d[key] # retrieve data at key (raise KeyError if no
# such key)
del d[key] # delete data stored at key (raises KeyError
# if no such key)
flag = key in d # true if the key exists
list = d.keys() # return a list of all existing keys (slow!)
Future versions may change the order in which implementations are
tested for existence, add interfaces to other dbm-like
implementations.
The open function has an optional second argument. This can be 'r',
for read-only access, 'w', for read-write access of an existing
database, 'c' for read-write access to a new or existing database, and
'n' for read-write access to a new database. The default is 'r'.
Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it
only if it doesn't exist; and 'n' always creates a new database.
"""
class error(Exception):
pass
_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
_errors = [error]
_defaultmod = None
for _name in _names:
try:
_mod = __import__(_name)
except ImportError:
continue
if not _defaultmod:
_defaultmod = _mod
_errors.append(_mod.error)
if not _defaultmod:
raise ImportError("no dbm clone found; tried %s" % _names)
error = tuple(_errors)
def open(file, flag = 'r', mode = 0o666):
# guess the type of an existing database
from whichdb import whichdb
result=whichdb(file)
if result is None:
# db doesn't exist
if 'c' in flag or 'n' in flag:
# file doesn't exist and the new
# flag was used so use default type
mod = _defaultmod
else:
raise error("need 'c' or 'n' flag to open new db")
elif result == "":
# db type cannot be determined
raise error("db type could not be determined")
else:
mod = __import__(result)
return mod.open(file, flag, mode)
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...