kj <no.em...@please.post> wrote: > I suppose one could refactor this: > ><procedural> > def spam(x, y, z): > try: > mongo = spam.mongo > except AttributeError: > mongo = spam.mongo = heavy_lifting_at_runtime() > return frobnicate(x, y, z, mongo) > > ham = spam(3, 4, 5) ></procedural> > > into this: > ><OO> > class _Spam(object): > @classmethod > def _(cls, x, y, z): > try: > mongo = cls.mongo > except AttributeError: > mongo = cls.mongo = heavy_lifting_at_runtime() > return frobnicate(x, y, z, mongo) > > ham = _Spam._(1, 2, 3) ></OO> > > > Is this really more natural or more readable? Hmmm.
No, but that's because it is needlessly obfuscated. What's with the weird _ method? Why use a class method? Why not just create an instance? class Spam(object): mongo = None def __call__(self, x, y, z): if self.mongo is None: self.mongo = heavy_lifting_at_runtime() return frobnicate(x, y, z, self.mongo) spam = Spam() ham = spam(1, 2, 3) That's natural and readable. There's also another good reason why the class is better than the static variable: you can construct multiple different instances with different calls to 'heavy_lifting_at_runtime'. e.g. You could write a unit test where mongo is initialised to mock_heavy_lifting_at_runtime(). -- http://mail.python.org/mailman/listinfo/python-list