On Apr 2, 2:38 pm, Ethan Furman <et...@stoneleaf.us> wrote:
> Patrick Maupin wrote:
> > On Apr 2, 1:21 pm, Ethan Furman <et...@stoneleaf.us> wrote:
> >> For this type of situation, my preference would be:
>
> >> class spam(object):
> >>      def __call__(self, x, y, z):
> >>          try:
> >>              mongo = self.mongo
> >>          except AttributeError:
> >>              mongo = self.mongo = heavy_lifting_at_runtime()
> >>          return frobnicate(x, y, z, mongo)
> >> spam = spam()
>
> >> No extra objects, out-of-place underscores, etc.
>
> >> ~Ethan~
>
> > Well, I'm not a big fan of unnecessary try/except, so I would at least
> > change it to:
>
> > class spam(object):
> >      def __getattr__(self, name):
> >          if name != 'mongo':
> >              raise AttributeError
> >          self.mongo = heavy_lifting_at_runtime()
> >          return self.mongo
> >      def __call__(self, x, y, z):
> >          return frobnicate(x, y, z, self.mongo)
> > spam = spam()
>
> > Regards,
> > Pat
>
> Sounds like a personal preference issue, rather than a necessary /
> unnecessary issue -- after all, if you call that function a thousand
> times, only once is mongo not defined... clearly the exception.  ;)
>
> ~Ethan~

Well, I think the whole discussion has basically been about personal
preference.  OTOH, but if you call the function a few million times,
you might find the cost of try/except to be something that you would
rather not incur -- it might become a performance issue rather than a
personal choice issue.  On the other OTHER hand, if you call the
function a few billion times, performance weighs more heavily in favor
of the closure approach rather than the object approach, since local
variable lookup is so much cheaper.

Regards,
Pat
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to