Paul Winkler wrote:
On Fri, May 27, 2005 at 12:08:55PM -0400, Paul Winkler wrote:
On Fri, May 27, 2005 at 11:49:03AM -0400, Jim Fulton wrote:
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.
One more thought... as for "funny globals", it seems to me that a "private" global like __marker = [] results in cleaner code than either your approach or the keyword arg hack.
I don't agree. In my approach, there isn't a global to begin with. ...
But of course we don't do it because accessing globals in a method that might be looped over is slow. Which, hopefully, will become a non-issue some day (PEP 267, 268, 280).
Note that in my version above, marker is a local rather than a global and gets looked up at local-variable speed. Jim -- Jim Fulton mailto:jim@zope.com Python Powered! CTO (540) 361-1714 http://www.python.org Zope Corporation http://www.zope.com http://www.zope.org