Yesterday, I upgraded to Zope 2.7.1.

Because several of our extensions broke, I have to look into detail
at the changed and I saw that the "hasattr geddon" was started.
Unfortunately, in a way that I feel as not optimal and error prone...

In the module I saw, "if hasattr(obj, attr)" has been replaced by
"if getattr(obj, attr, None)".
This is neither general (in the special case, it was at least not false),
nor optimal (in the special case, the boolean check was very expensive)
nor clear.

I propose to implement the "hasattr geddon" instead by a monkey
patch for Python's builtin "hasattr".

This has the following advantages:

  *  no code changes needed with the exception of the monkey patch

  *  the code is as clear as possible

  *  the implementation can be made efficient and safe

  *  no danger of missed "hasattr" occurrences


  *  Occasionally, a "hasattr" call might become slightly more
     inefficient than necessary (when "hasattr" operates
     on an object which is not persistent).

  *  the usual problems with monkey patches (if someone else tries
     to monkey patch "hasattr", too)

The "hasattr" replacement in Python's "__builtin__" could look like:

    _marker = []
    def hasattr(obj, attr):
        return getattr(obj, attr, _marker) is not _marker


Zope-Dev maillist  -  [EMAIL PROTECTED]
**  No cross posts or HTML encoding!  **
(Related lists - )

Reply via email to