[Zope-dev] Re: [Zope-Checkins] SVN: Zope/branches/Zope-2_8-branch/
fix #2235 for real now
Chris Withers
chris at simplistix.co.uk
Fri Nov 17 02:48:20 EST 2006
Leonardo Rochael Almeida wrote:
>>> - obj = self.aq_parent.unrestrictedTraverse(self.getpath(rid))
>>> - if not obj:
>>> + obj = self.aq_parent.unrestrictedTraverse(self.getpath(rid), None)
>>> + if obj is None:
>> Please revert this change. You've changed the semantics of this
>> statement and it will now mask errors in traversing to the path.
>>
>> This is bad...
>
> I agree with you the semantics have changed, but I argue that they've
> changed to what they were intended to be in the first place :-)
This argument has been had many times before, please google zope-dev's
archives for the numerous discussions on this and then check the current
implementation in
Products/ZCatalog/CatalogBrains.py:AbstractCatalogBrains.getOject.
> This is the full method before my changes:
>
> def getobject(self, rid, REQUEST=None):
> """Return a cataloged object given a 'data_record_id_'
> """
> obj = self.aq_parent.unrestrictedTraverse(self.getpath(rid))
> if not obj:
> if REQUEST is None:
> REQUEST=self.REQUEST
> obj = self.resolve_url(self.getpath(rid), REQUEST)
> return obj
This code is just plain rubbish, there's no single bug here.
I'd like someone to give a use case where unrestrictedTraverse fails and
yet where resolve_url works.
> Traversing with a default argument will only mask traversal errors, not
> any other errors that might happen during traversing.
Sure it will, see previous discussions...
> In the version with my changes, but with the old unrestrictedTraverse
> call, the "if obj is None" would only ever be reached in the
> pathological situation where the attribute at the end of the path is
> None. Which means the ".resolve_url(self.getpath(rid), REQUEST)" would
> hardly ever be called at all.
Correct. .resolve_url(self.getpath(rid), REQUEST) hardly ever gets called.
> A) Keep my changes, but use a marker "object()" instead of None for the
> "default" parameter of the .unrestrictedTraverse() call.
>
> B) Reverse my changes, but also remove the "if not obj" block, which is
> buggy whichever way you look at it with the old unrestrictedTraverse
> call.
>
> Which one should it be?
I'd go for B.
cheers,
Chris
--
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
More information about the Zope-Dev
mailing list