summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Bishop <stuart@stuartbishop.net>2013-09-06 08:11:29 +0000
committerStuart Bishop <stuart@stuartbishop.net>2013-09-06 08:11:29 +0000
commitcfa8bdb96f74719a01d07126bc8100284f7eaba5 (patch)
tree6bc7825c72751111350148f86f6262971cd4f1e4
parent158a299c3bb47f19923847ac49b43d86d4412a08 (diff)
downloadpytz-cfa8bdb96f74719a01d07126bc8100284f7eaba5.tar.gz
Improve lazy implementations
-rw-r--r--src/pytz/lazy.py58
1 files changed, 31 insertions, 27 deletions
diff --git a/src/pytz/lazy.py b/src/pytz/lazy.py
index aed7e10..8b7e1ac 100644
--- a/src/pytz/lazy.py
+++ b/src/pytz/lazy.py
@@ -66,14 +66,17 @@ class LazyDict(DictMixin):
class LazyList(list):
"""List populated on first use."""
- def __new__(cls, fill_iter):
+ def __new__(cls, fill_iter=None):
+
+ if fill_iter is None:
+ return list()
class LazyList(list):
_fill_iter = None
_props = (
'__str__', '__repr__', '__unicode__',
- '__hash__', '__sizeof__', '__cmp__', '__nonzero__',
+ '__hash__', '__sizeof__', '__cmp__',
'__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__',
'append', 'count', 'index', 'extend', 'insert', 'pop', 'remove',
'reverse', 'sort', '__add__', '__radd__', '__iadd__', '__mul__',
@@ -83,17 +86,16 @@ class LazyList(list):
def lazy(name):
def _lazy(self, *args, **kw):
- if self._fill_iter is not None:
- _fill_lock.acquire()
- try:
- if self._fill_iter is not None:
- list.extend(self, self._fill_iter)
- self._fill_iter = None
- finally:
- _fill_lock.release()
- real = getattr(list, name)
- setattr(self.__class__, name, real)
- return real(self, *args, **kw)
+ _fill_lock.acquire()
+ try:
+ if self._fill_iter is not None:
+ list.extend(self, self._fill_iter)
+ del self._fill_iter
+ for method_name in _props:
+ delattr(LazyList, method_name)
+ finally:
+ _fill_lock.release()
+ return getattr(list, name)(self, *args, **kw)
return _lazy
for name in _props:
@@ -106,14 +108,17 @@ class LazyList(list):
class LazySet(set):
"""Set populated on first use."""
- def __new__(cls, fill_iter):
+ def __new__(cls, fill_iter=None):
+
+ if fill_iter is None:
+ return set()
class LazySet(set):
_fill_iter = None
_props = (
'__str__', '__repr__', '__unicode__',
- '__hash__', '__sizeof__', '__cmp__', '__nonzero__',
+ '__hash__', '__sizeof__', '__cmp__',
'__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__',
'__contains__', '__len__', '__nonzero__',
'__getitem__', '__setitem__', '__delitem__', '__iter__',
@@ -128,18 +133,17 @@ class LazySet(set):
def lazy(name):
def _lazy(self, *args, **kw):
- if self._fill_iter is not None:
- _fill_lock.acquire()
- try:
- if self._fill_iter is not None:
- for i in self._fill_iter:
- set.add(self, i)
- self._fill_iter = None
- finally:
- _fill_lock.release()
- real = getattr(set, name)
- setattr(self.__class__, name, real)
- return real(self, *args, **kw)
+ _fill_lock.acquire()
+ try:
+ if self._fill_iter is not None:
+ for i in self._fill_iter:
+ set.add(self, i)
+ del self._fill_iter
+ for method_name in _props:
+ delattr(LazySet, method_name)
+ finally:
+ _fill_lock.release()
+ return getattr(set, name)(self, *args, **kw)
return _lazy
for name in _props: