]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Move __init__ from BaseSet into Set and ImmutableSet. This causes a
authorGuido van Rossum <guido@python.org>
Tue, 20 Aug 2002 21:38:37 +0000 (21:38 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 20 Aug 2002 21:38:37 +0000 (21:38 +0000)
tiny amount of code duplication, but makes it possible to give BaseSet
an __init__ that raises an exception.

Lib/sets.py

index 4df30f81466216bcd9b6b4571dc71902f0c60f35..c301c4183be48ff009f5f2c28d32a543c4727747 100644 (file)
@@ -63,20 +63,12 @@ class BaseSet(object):
 
     # Constructor
 
-    def __init__(self, seq=None):
-        """Construct a set, optionally initializing it from a sequence."""
-        self._data = {}
-        if seq is not None:
-            # I don't know a faster way to do this in pure Python.
-            # Custom code written in C only did it 65% faster,
-            # preallocating the dict to len(seq); without
-            # preallocation it was only 25% faster.  So the speed of
-            # this Python code is respectable.  Just copying True into
-            # a local variable is responsible for a 7-8% speedup.
-            data = self._data
-            value = True
-            for key in seq:
-                data[key] = value
+    def __init__(self):
+        """This is an abstract class."""
+        # Don't call this from a concrete subclass!
+        if self.__class__ is BaseSet:
+            raise NotImplementedError, ("BaseSet is an abstract class.  "
+                                        "Use Set or ImmutableSet.")
 
     # Standard protocols: __len__, __repr__, __str__, __iter__
 
@@ -289,9 +281,19 @@ class ImmutableSet(BaseSet):
 
     def __init__(self, seq):
         """Construct an immutable set from a sequence."""
-        # Override the constructor to make 'seq' a required argument
-        BaseSet.__init__(self, seq)
         self._hashcode = None
+        self._data = data = {}
+        # I don't know a faster way to do this in pure Python.
+        # Custom code written in C only did it 65% faster,
+        # preallocating the dict to len(seq); without
+        # preallocation it was only 25% faster.  So the speed of
+        # this Python code is respectable.  Just copying True into
+        # a local variable is responsible for a 7-8% speedup.
+        value = True
+        # XXX Should this perhaps look for _as_immutable?
+        # XXX If so, should use self.update(seq).
+        for key in seq:
+            data[key] = value
 
     def __hash__(self):
         if self._hashcode is None:
@@ -306,6 +308,16 @@ class Set(BaseSet):
 
     # BaseSet + operations requiring mutability; no hashing
 
+    def __init__(self, seq=None):
+        """Construct an immutable set from a sequence."""
+        self._data = data = {}
+        if seq is not None:
+            value = True
+            # XXX Should this perhaps look for _as_immutable?
+            # XXX If so, should use self.update(seq).
+            for key in seq:
+                data[key] = value
+
     # In-place union, intersection, differences
 
     def union_update(self, other):