'if foo' calls getattr?!?
da at ski.org
Mon Aug 30 20:05:59 CEST 1999
On Mon, 30 Aug 1999, Joe Strout wrote:
> [[ This message was both posted and mailed: see
> the "To," "Cc," and "Newsgroups" headers for details. ]]
> Doing some profiling on Graphite this weekend, we found a very curious
> thing: a gazillion calls to __getattr__ on one of our classes, where we
> expected to find none. We eventually tracked it down to a seemingly
> innocent test, basically, "if foo: self.myfoo = foo". The "if foo" was
> invoking foo.__getattr__ (which is very expensive).
> I can think of no reason why it should be this way, but it is. Below is
> a very simple stand-alone demonstration. It leads me to the absurd
> idiom of saying "if id(foo) != id(None)" when I really mean "if foo",
> just because using id() avoids the __getattr__ call.
> Can anybody explain why this should be? Is it a bug in Python? Is
> there some other way to check whether I have a reference to an object
> that doesn't involve a function call?
Use 'if foo is not None' to do identity checking and not truth testing.
You're getting a getattr call because your class might define its own way
of testing truth -- for more details, see:
More information about the Python-list