[Zope-dev] Re: hasattr implementation for Zope?
Jim Fulton
jim at zope.com
Fri May 27 11:49:03 EDT 2005
Paul Winkler wrote:
> On Fri, May 27, 2005 at 09:25:58AM -0400, Jim Fulton wrote:
>
>>Tim Peters wrote:
>>
>>>OTOH, defining & importing a utility function-- say, safehasattr()
>>>--would make it all explicit. That's what ZODB does.
>
>
> OK.
>
> (BTW, I just went grepping for this safehasattr() in zope 2.7.6's
> ZODB and didn't find anything. What's it called?)
>
> There are ~700 calls to hasattr() currently in the Zope core (ouch!).
> Are there cases where the current use of hasattr() is considered safe?
> Or since it's "broken by design", should we replace all 700
> calls with this hypothetical safe_hasattr()?
>
> While we're on the subject, the other day Dieter Maurer was complaining that:
>
> """
> An incredibly long time ago, I filed a feature request for
> "hasattr_unacquired" -- together with patch, unit tests and
> documentation
> update. I am convinced that such a function in the
> DTML namespace (and therefore always available in restricted code)
> would be much clearer than the "aq_inner.aq_explicit" dance.
>
> But, unfortunately, the Zope developers decided not to
> accept my patch or the "hasattr_unacquired" idea
> and instead made "aq_inner" accessible by untrusted code.
> A bad decision!
> As a consequence, you see the nasty code.
> """
I'm sure this was an unintentional non-acceptance. It would be
a lot easier if Dieter became a contributor and checked this in
himself. I'd be happy to see Dieter's patch accepted.
> So, assuming we add a safe_hasattr() function, maybe it could take
> an extra keyword arg?
>
> something like:
>
> def safe_hasattr(obj, attr, acquired=True, _marker=[]):
> if not acquired:
> obj = aq_inner(aq_explicit(obj))
> return getattr(obj, attr, _marker) is not _marker
I'd rather have 2 separate functions.
BTW, I prefer to code things like this in the following way:
def safe_hasattr():
marker = object()
def safe_hasattr(obj, attr):
return getattr(obj, attr, marker) is not marker
return safe_hasattr
safe_hasattr = safe_hasattr()
This way, there aren't any extra arguments or funny
globals to confuse matters. (I've seen code that broke
because people tried to reuse marker definitions accross
modules.
BTW, I think this function or something like it should be
added to the Python standard library. Anybody want to
try to get it into 2.5?
Jim
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Zope-Dev
mailing list