On Fri, May 27, 2005 at 01:10:29PM -0400, Jim Fulton wrote:
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.
Yeah, but to me, it seems like a nested function definition and rebinding the name is a bit much bother just to avoid a single private global. It adds a bit of mental effort for readers who haven't seen the idiom before, especially newcomers to python.
Note that in my version above, marker is a local rather than a global and gets looked up at local-variable speed.
Yes, that is very nice. -- Paul Winkler http://www.slinkp.com