1 |
Author: zmedico |
2 |
Date: 2009-02-28 01:06:30 +0000 (Sat, 28 Feb 2009) |
3 |
New Revision: 12730 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/portage/dep.py |
7 |
Log: |
8 |
Make Atom instances consume less memory by implementing str methods at the |
9 |
class level instead of referencing bound str methods. |
10 |
|
11 |
|
12 |
Modified: main/trunk/pym/portage/dep.py |
13 |
=================================================================== |
14 |
--- main/trunk/pym/portage/dep.py 2009-02-27 05:23:37 UTC (rev 12729) |
15 |
+++ main/trunk/pym/portage/dep.py 2009-02-28 01:06:30 UTC (rev 12730) |
16 |
@@ -506,14 +506,8 @@ |
17 |
__metaclass__ = _AtomCache |
18 |
_atoms = weakref.WeakValueDictionary() |
19 |
|
20 |
- _str_methods = ("endswith", "find", "index", "lstrip", "replace", |
21 |
- "startswith", "split", "strip", |
22 |
- "rindex", "rfind", "rstrip", "__getitem__", |
23 |
- "__eq__", "__hash__", "__len__", "__lt__", |
24 |
- "__ne__", "__repr__", "__str__") |
25 |
- |
26 |
__slots__ = ("__weakref__", "blocker", "cp", "cpv", "operator", |
27 |
- "slot", "use") + _str_methods |
28 |
+ "slot", "use", "_str") |
29 |
|
30 |
class _blocker(object): |
31 |
__slots__ = ("overlap",) |
32 |
@@ -531,8 +525,7 @@ |
33 |
if not isvalidatom(s, allow_blockers=True): |
34 |
raise InvalidAtom(s) |
35 |
obj_setattr = object.__setattr__ |
36 |
- for x in self._str_methods: |
37 |
- obj_setattr(self, x, getattr(s, x)) |
38 |
+ obj_setattr(self, '_str', s) |
39 |
|
40 |
blocker = "!" == s[:1] |
41 |
if blocker: |
42 |
@@ -561,6 +554,65 @@ |
43 |
raise AttributeError("Atom instances are immutable", |
44 |
self.__class__, name, value) |
45 |
|
46 |
+ # Implement some common str methods. |
47 |
+ |
48 |
+ def __eq__(self, other): |
49 |
+ return self._str == other |
50 |
+ |
51 |
+ def __getitem__(self, key): |
52 |
+ return self._str[key] |
53 |
+ |
54 |
+ def __hash__(self): |
55 |
+ return hash(self._str) |
56 |
+ |
57 |
+ def __len__(self): |
58 |
+ return len(self._str) |
59 |
+ |
60 |
+ def __lt__(self, other): |
61 |
+ return self._str < other |
62 |
+ |
63 |
+ def __ne__(self, other): |
64 |
+ return self._str != other |
65 |
+ |
66 |
+ def __repr__(self): |
67 |
+ return repr(self._str) |
68 |
+ |
69 |
+ def __str__(self): |
70 |
+ return str(self._str) |
71 |
+ |
72 |
+ def endswith(self, *pargs, **kargs): |
73 |
+ return self._str.endswith(*pargs, **kargs) |
74 |
+ |
75 |
+ def find(self, *pargs, **kargs): |
76 |
+ return self._str.find(*pargs, **kargs) |
77 |
+ |
78 |
+ def index(self, *pargs, **kargs): |
79 |
+ return self._str.index(*pargs, **kargs) |
80 |
+ |
81 |
+ def lstrip(self, *pargs, **kargs): |
82 |
+ return self._str.lstrip(*pargs, **kargs) |
83 |
+ |
84 |
+ def replace(self, *pargs, **kargs): |
85 |
+ return self._str.replace(*pargs, **kargs) |
86 |
+ |
87 |
+ def startswith(self, *pargs, **kargs): |
88 |
+ return self._str.startswith(*pargs, **kargs) |
89 |
+ |
90 |
+ def split(self, *pargs, **kargs): |
91 |
+ return self._str.split(*pargs, **kargs) |
92 |
+ |
93 |
+ def strip(self, *pargs, **kargs): |
94 |
+ return self._str.strip(*pargs, **kargs) |
95 |
+ |
96 |
+ def rindex(self, *pargs, **kargs): |
97 |
+ return self._str.rindex(*pargs, **kargs) |
98 |
+ |
99 |
+ def rfind(self, *pargs, **kargs): |
100 |
+ return self._str.rfind(*pargs, **kargs) |
101 |
+ |
102 |
+ def rstrip(self, *pargs, **kargs): |
103 |
+ return self._str.rstrip(*pargs, **kargs) |
104 |
+ |
105 |
def get_operator(mydep): |
106 |
""" |
107 |
Return the operator used in a depstring. |