Staging
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
Raw File
Tip revision: ba756b5a2b3d3d127420805c7aa096abc9eccd7b authored by Benjamin Peterson on 02 April 2008, 02:27:22 UTC
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)
back to top