Has anyone tried SQLAlchemy with a recent build of Python 2.6 up to and including the Alpha 1 release? It seems that something has changed about the behavior of the built-in hash() function. In particular, I am getting the following exception when trying to construct a Column object:
File "init_hook.py", line 33, in initMappers
Column('url', String())
File "...\SQLAlchemy\lib\sqlalchemy\schema.py", line 105, in __call__
return type.__call__(self, name, metadata, *args, **kwargs)
File "...\SQLAlchemy\lib\sqlalchemy\schema.py", line 203, in __init__
self.primary_key = PrimaryKeyConstraint()
File "...\SQLAlchemy\lib\sqlalchemy\schema.py", line 283, in
_set_primary_key
self.constraints.add(pk)
TypeError: unhashable type: 'PrimaryKeyConstraint'
The above line numbers are for SQLAlchemy 0.4.3. The same error occurs
with version 0.3.11. This appears to be a change in the strictness of
hashability for objects. According to the Python 2.5 description of
__hash__(), the class for a mutable object can define __eq__() or
__cmp__(), but it should not define __hash__(). With Python 2.6, it
seems to me that the presence of __eq__() and the absence of
__hash__() is interpreted as the type being unhashable, which was not
the case with Python 2.5. The following code, when executed with
Python 2.5 and 2.6a1, demonstrates the difference:
class Works(object):
def __init__(self):
self._value = 'works'
class Works2(object):
def __init__(self):
self._value = 'works2'
def __eq__(self, other):
return self._value == other._value
def __hash__(self):
return hash(self._value)
class Fails(object):
def __init__(self):
self._value = 'false'
def __eq__(self, other):
return self._value == other.value
hash(Works())
hash(Works2())
# Raises TypeError with Python 2.6 because Fails is deemed unhashable.
hash(Fails())
Does anyone know of a workaround for this issue? So far,
sqlalchemy.schema.PrimaryKeyConstraint and sqlalchemy.schema.Column
are the two classes that have tripped me up. I have added __hash__()
methods to both, but I cannot vouch for the correctness of the
implementations.
-Patrick
--
Patrick L. Hartling
Senior Software Engineer, Priority 5
http://www.priority5.com/
PGP.sig
Description: This is a digitally signed message part
