Hi! In KeywordIndex the newKeywords get called if they are "callable": def _get_object_keywords(self,obj): newKeywords = getattr(obj, self.id, ()) if callable(newKeywords): # (*) newKeywords = newKeywords() if hasattr(newKeywords,'capitalize'): # is it string-like ? newKeywords = (newKeywords, ) return newKeywords This fails if the newKeywords are stored in a PersistentList. Callable is true, but there is no __call__ attribute. I changed the line marked with (*) to if hasattr(newKeyword, "__call__"): and this seems to work I think this does not break anything and could be included in the original. Am I the first how uses PersistentList for an indexed attribute? Is there a reason not to do so? thomas Please CC to me I am not on the list yet -- Thomas Guettler <guettli@thomas-guettler.de> http://www.thomas-guettler.de
Thomas Guettler wrote:
Hi!
In KeywordIndex the newKeywords get called if they are "callable": def _get_object_keywords(self,obj): newKeywords = getattr(obj, self.id, ()) if callable(newKeywords): # (*) newKeywords = newKeywords() if hasattr(newKeywords,'capitalize'): # is it string-like ? newKeywords = (newKeywords, ) return newKeywords
This fails if the newKeywords are stored in a PersistentList.
Callable is true, but there is no __call__ attribute.
I changed the line marked with (*) to if hasattr(newKeyword, "__call__"):
and this seems to work
I think this does not break anything and could be included in the original.
Am I the first how uses PersistentList for an indexed attribute? Is there a reason not to do so?
The KeywordIndex should be changed to check for the __call__ attribute, rather than relying on 'callable'. You cannot reliably use 'callable' when you're also using acquisition wrappers. See my comment to this Collector report. http://collector.zope.org/Zope/578 I suggest you report the bug you have found in the Collector. -- Steve Alexander
Just a note that this can't be put in Zope 2.6 since functions and methods don't have a __call__ in Python 2.1. -Casey On Wednesday 20 November 2002 02:33 pm, Steve Alexander wrote:
Thomas Guettler wrote:
Hi!
In KeywordIndex the newKeywords get called if they are "callable": def _get_object_keywords(self,obj): newKeywords = getattr(obj, self.id, ()) if callable(newKeywords): # (*) newKeywords = newKeywords() if hasattr(newKeywords,'capitalize'): # is it string-like ? newKeywords = (newKeywords, ) return newKeywords
This fails if the newKeywords are stored in a PersistentList.
Callable is true, but there is no __call__ attribute.
I changed the line marked with (*) to if hasattr(newKeyword, "__call__"):
and this seems to work
I think this does not break anything and could be included in the original.
Am I the first how uses PersistentList for an indexed attribute? Is there a reason not to do so?
The KeywordIndex should be changed to check for the __call__ attribute, rather than relying on 'callable'. You cannot reliably use 'callable' when you're also using acquisition wrappers.
See my comment to this Collector report.
http://collector.zope.org/Zope/578
I suggest you report the bug you have found in the Collector.
-- Steve Alexander
What about ``if callable(aq_base(newKeywords)):`` to remove potential acquisition wrappers? On Wednesday, November 20, 2002, at 12:41 PM, Casey Duncan wrote:
Just a note that this can't be put in Zope 2.6 since functions and methods don't have a __call__ in Python 2.1.
-Casey
On Wednesday 20 November 2002 02:33 pm, Steve Alexander wrote:
Thomas Guettler wrote:
Hi!
In KeywordIndex the newKeywords get called if they are "callable": def _get_object_keywords(self,obj): newKeywords = getattr(obj, self.id, ()) if callable(newKeywords): # (*) newKeywords = newKeywords() if hasattr(newKeywords,'capitalize'): # is it string-like ? newKeywords = (newKeywords, ) return newKeywords
This fails if the newKeywords are stored in a PersistentList.
Callable is true, but there is no __call__ attribute.
I changed the line marked with (*) to if hasattr(newKeyword, "__call__"):
and this seems to work
I think this does not break anything and could be included in the original.
Am I the first how uses PersistentList for an indexed attribute? Is there a reason not to do so?
The KeywordIndex should be changed to check for the __call__ attribute, rather than relying on 'callable'. You cannot reliably use 'callable' when you're also using acquisition wrappers.
See my comment to this Collector report.
http://collector.zope.org/Zope/578
I suggest you report the bug you have found in the Collector.
-- Steve Alexander
_______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org http://lists.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope )
"JPS" == Jeffrey P Shell <Jeffrey> writes:
JPS> What about ``if callable(aq_base(newKeywords)):`` to remove JPS> potential acquisition wrappers? callable() returns True for any instance. Since PersistentList is an instance, you can't use callable() to determine whether it is callable. Jeremy
Jeremy Hylton wrote:
"JPS" == Jeffrey P Shell writes:
JPS> What about ``if callable(aq_base(newKeywords)):`` to remove JPS> potential acquisition wrappers?
callable() returns True for any instance.
Any instance of what? [steve@localhost]$ python2.2 Python 2.2.2 (#1, Oct 31 2002, 10:45:23) [GCC 2.96 20000731 (Red Hat Linux 7.2 2.96-108.7.2)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
callable(object()) 0 class Foo: ... pass ... callable(Foo()) 0
-- Steve Alexander
It must be any instance of an ExtensionClass. I think Python instances used to be true-for-callable as well, but that must have been fixed. Python 2.1.3 (#5, Aug 15 2002, 10:41:31) [GCC 2.95.3 19991030 (prerelease)] on linux2 Type "copyright", "credits" or "license" for more information.
from ZODB.PersistentList import * callable(PersistentList()) 1
Jeremy
There is a workaround for this in the DocumentTemplate package. It implements a "safe_callable" function that seems to do the right thing with ext class instances: def safe_callable(ob): # Works with ExtensionClasses and Acquisition. if hasattr(ob, '__class__'): if hasattr(ob, '__call__'): return 1 else: return type(ob) in ClassTypes else: return callable(ob) On Mon, 2002-11-25 at 13:01, Jeremy Hylton wrote:
It must be any instance of an ExtensionClass. I think Python instances used to be true-for-callable as well, but that must have been fixed.
Python 2.1.3 (#5, Aug 15 2002, 10:41:31) [GCC 2.95.3 19991030 (prerelease)] on linux2 Type "copyright", "credits" or "license" for more information.
from ZODB.PersistentList import * callable(PersistentList()) 1
Jeremy
_______________________________________________ Zope-Dev maillist - Zope-Dev@zope.org http://lists.zope.org/mailman/listinfo/zope-dev ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope )
participants (6)
-
Casey Duncan -
Chris McDonough -
Jeffrey P Shell -
jeremy@zope.com -
Steve Alexander -
Thomas Guettler