[PEAK] ObjectWrapper subclasses always callable

Marcin Tustin marcin.tustin at gmail.com
Wed May 23 14:18:53 EDT 2012

I'm wrapping an object to pass to a django form, to alter how it is
displayed in the form. Django's form rendering code has the code:
if callable(data):
    data = data()

This breaks when passed the proxy object, because the underlying object is
not callable.

On Wed, May 23, 2012 at 7:01 PM, PJ Eby <pje at telecommunity.com> wrote:

> On Wed, May 23, 2012 at 11:25 AM, Marcin Tustin <marcin.tustin at gmail.com>wrote:
>> Python 2.7.2
>> On Wed, May 23, 2012 at 4:23 PM, PJ Eby <pje at telecommunity.com> wrote:
>>> On May 23, 2012 10:39 AM, "Marcin Tustin" <marcin.tustin at gmail.com>
>>> wrote:
>>> >
>>> > I've found that instances of ObjectWrapper (and any subclasses) are
>>> always callable (the callable function returns True), notwithstanding that
>>> the __subject__ is not callable. Is there a way to remedy this?
>>> >
>>> > I've tried deleting the __call__ method, creating empty slots,
>>> creating my own call method, then trying to delete, using del or delattr on
>>> the subclass object, and creating a custom __getattribute__, all to no
>>> avail.
>>> Which Python version are you using?
>> Okay, I've verified that this happens all the way back to 2.3, so that's
> not it.  (I think that maybe Python 3 uses hasattr(__call__) as its
> callable() implementation, but I'm not sure.)
> It looks like the only way for me to fix this is with a major revision:
> change the base classes to not have a __call__ slot, and dynamically change
> type at runtime to a subclass with a __call__ slot, if and only if their
> subject is callable...  and to somehow change if the subject changes.  (Not
> really sure how that's going to work.)
> What's the use case for this?  What code is using callable(), and can you
> convince its author to use hasattr instead?  ;-)

Marcin Tustin
Tel: 07773 787 105
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.eby-sarna.com/pipermail/peak/attachments/20120523/01ef95cb/attachment.html

More information about the PEAK mailing list