Instead of having Atom inherit from str, just emulate the interface. This
authorZac Medico <zmedico@gentoo.org>
Fri, 20 Jun 2008 14:37:49 +0000 (14:37 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 20 Jun 2008 14:37:49 +0000 (14:37 -0000)
allows us to define __slots__ (not allowed when inheriting from str) and
therefore should conserve some memory by avoiding a __dict__ attribute
on every Atom.

svn path=/main/trunk/; revision=10740

pym/portage/dep.py

index df6bdfd3e2d39b9bd2f3963e7f0ad41216398362..03f428495ae47af51604f7faa3e5584c18cbdfdb 100644 (file)
@@ -392,12 +392,25 @@ class _use_dep(object):
                tokens.extend(self.conditional_disabled.difference(use))
                return _use_dep(tokens)
 
-class Atom(str):
+class Atom(object):
+
+       """
+       For compatibility with existing atom string manipulation code, this
+       class emulates most of the str methods that are useful with atoms.
+       """
+
+       _str_methods = ("endswith", "find", "index", "lstrip", "replace",
+               "startswith", "strip", "rindex", "rfind", "rstrip", "__getitem__",
+               "__len__", "__repr__", "__str__")
+
+       __slots__ = ("__weakref__", "blocker", "cp", "cpv", "operator",
+               "slot", "string", "use") + _str_methods
 
        def __init__(self, s):
-               str.__init__(self, s)
                if not isvalidatom(s, allow_blockers=True):
                        raise InvalidAtom(s)
+               for x in self._str_methods:
+                       setattr(self, x, getattr(s, x))
                self.blocker = "!" == s[:1]
                if self.blocker:
                        s = s[1:]