This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author gagern
Recipients gagern
Date 2011-08-09.20:16:28
SpamBayes Score 1.3907897e-10
Marked as misclassified No
Message-id <1312920990.32.0.154264120854.issue12719@psf.upfronthosting.co.za>
In-reply-to
Content
The attached C extension provides a way to manually set an element in the dict of an extension type. As the test case exposes, this can result in a discrepancy between cls.__dict__['key'] and cls.key.

Please tell me up front if my extension simply does something explixitely forbidden, and point me at the documentation saying so.
http://docs.python.org/py3k/c-api/typeobj.html#PyTypeObject.tp_dict at least doesn't appear to explicitely forbid my approach, even if it probably is not the preferred way.

If you consider what I'm doing to be really evil, you might want to ban that practice more clearly, by adding a suitable note to the documentation of the tp_dict member.

In case you cannot reproduce, running the attached testcase script with "test" as its sole command line argument, I get the following lines, among others:

Traceback (most recent call last):
  File ".../setDictTest.py", line 10, in test1
    self.assertEqual(setDictCls.__dict__['key'], setDictCls.key)
AssertionError: 'bar' != 'foo'

I assume that the attribute-style setDictCls.key access will somehow cache its result, thus missing the modification to the underlying dict. Just a guess, though.

I've had this issue involved in segmentation faults, where the stale object had already been finalized. But as the code involved there might have been broken in other ways as well, I'll not classify this as type "crash" but only as "behaviour".
History
Date User Action Args
2011-08-09 20:16:30gagernsetrecipients: + gagern
2011-08-09 20:16:30gagernsetmessageid: <1312920990.32.0.154264120854.issue12719@psf.upfronthosting.co.za>
2011-08-09 20:16:29gagernlinkissue12719 messages
2011-08-09 20:16:29gagerncreate