-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 08/17/2011 12:01 PM, Gediminas Paulauskas wrote: > 2011/8/6 Tres Seaver <tsea...@palladion.com>: >> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 >> >> On 08/04/2011 10:18 AM, Gediminas Paulauskas wrote: >>> Log message for revision 122462: Fix a regression introduced in >>> 3.6.4, that made one zope.app.interface test fail >>> >>> >>> Changed: U zope.interface/trunk/CHANGES.txt U >>> zope.interface/trunk/src/zope/interface/interface.py >>> >>> -=- Modified: zope.interface/trunk/CHANGES.txt >>> =================================================================== >>> >>> - --- zope.interface/trunk/CHANGES.txt 2011-08-04 13:44:20 UTC (rev >>> 122461) +++ zope.interface/trunk/CHANGES.txt 2011-08-04 14:18:37 >>> UTC (rev 122462) @@ -11,10 +11,12 @@ >>> >>> - Fix testing deprecation warnings issued when tested under >>> Py3K. >>> >>> +- Fix ``InterfaceClass.__hash__`` to match comparison function. >>> + 3.6.4 (2011-07-04) ------------------ >>> >>> -- LP 804951: InterfaceClass instances were unhashable under >>> Python 3.x. +- LP #804951: InterfaceClass instances were >>> unhashable under Python 3.x. >>> >>> 3.6.3 (2011-05-26) ------------------ >>> >>> Modified: zope.interface/trunk/src/zope/interface/interface.py >>> =================================================================== >>> >>> - --- zope.interface/trunk/src/zope/interface/interface.py 2011-08-04 >>> 13:44:20 UTC (rev 122461) +++ >>> zope.interface/trunk/src/zope/interface/interface.py 2011-08-04 >>> 14:18:37 UTC (rev 122462) @@ -682,7 +682,8 @@ return (n1 > n2) - >>> (n1 < n2) >>> >>> def __hash__(self): - return hash((self.__name__, >>> self.__module__)) + return hash((getattr(self, >>> '__name__', ''), + getattr(self, >>> '__module__', ''))) >> >> I don't think this is a regression -- how do you legitimately >> create an interface without both those attributes? The point of >> the comparison function is to work even when handed a non-Interface >> object as one of the two terms being compared, which doesn't apply >> to the case of a hash. If there is code in zope.app.interface which >> is constructing a class derived from Interface but which doesn't >> call Interface.__init__ before hashing the instance, that code is >> *broken*, and should be fixed. > > It was my attempt to fix tests that were failing for more than a > week, and it worked. zope.app.interface might be broken, but I > couldn't understand why it failed, especially the "foreign > connection" exception. Here I saw asymmetry between __eq__ and > __hash__, and I still feel that my fix was better than returning 1.
For the relevant case (an instance whose '__name__' and '__module__' attributes were not set) your fix returned the hash of '('', '')', which is hardly an improvement over another fixed constant. The changes I checked into zope.app.interface make the PersistentInterface class do its equality testing / hashing based on its _p_jar and _p_oid: http://svn.zope.org/zope.app.interface/trunk/?rev=122544&view=rev > In addition to zope.app.interface, there was another problem with > Tahoe-LAFS: https://bugs.launchpad.net/zope.interface/+bug/811792 > that Tres helped to solve. The new releases don't really "solve" their problem: they still have code which tries to store derived interface obejcts into a module-scope dist from within the instance's '__new__'. That code is still broken (the objects won't be findable in the dict later), but it no longer raises exceptions during module imoprt: instead, it issues a UserWarning. Tres. - -- =================================================================== Tres Seaver +1 540-429-0999 tsea...@palladion.com Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk5Na+0ACgkQ+gerLs4ltQ5PEACfUITfcCYeHGJpH/IAAUeP4Bfx CAIAn3W8hYltSft2UPSbjnNgYL2NpCZt =lP14 -----END PGP SIGNATURE----- _______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org https://mail.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - https://mail.zope.org/mailman/listinfo/zope-announce https://mail.zope.org/mailman/listinfo/zope )