4679.3.5
by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings, |
1 |
# Copyright (C) 2009 Canonical Ltd
|
2 |
#
|
|
3 |
# This program is free software; you can redistribute it and/or modify
|
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
7 |
#
|
|
8 |
# This program is distributed in the hope that it will be useful,
|
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
12 |
#
|
|
13 |
# You should have received a copy of the GNU General Public License
|
|
14 |
# along with this program; if not, write to the Free Software
|
|
15 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16 |
||
4679.3.41
by John Arbash Meinel
Finish switching the naming to StaticTuple. |
17 |
"""The pure-python implementation of the StaticTuple type.
|
4679.3.5
by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings, |
18 |
|
19 |
Note that it is generally just implemented as using tuples of tuples of
|
|
20 |
strings.
|
|
21 |
"""
|
|
22 |
||
23 |
||
4679.3.78
by John Arbash Meinel
Change the pure-python version of StaticTuple |
24 |
class StaticTuple(tuple): |
4679.3.41
by John Arbash Meinel
Finish switching the naming to StaticTuple. |
25 |
"""A static type, similar to a tuple of strings."""
|
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
26 |
|
4771.1.1
by John Arbash Meinel
Don't allow extra attributes on the pure-python StaticTuple. |
27 |
__slots__ = () |
28 |
||
4679.3.44
by John Arbash Meinel
Special case the empty tuple as a singleton. |
29 |
def __new__(cls, *args): |
4679.3.78
by John Arbash Meinel
Change the pure-python version of StaticTuple |
30 |
# Make the empty StaticTuple a singleton
|
4679.3.44
by John Arbash Meinel
Special case the empty tuple as a singleton. |
31 |
if not args and _empty_tuple is not None: |
32 |
return _empty_tuple |
|
4679.3.78
by John Arbash Meinel
Change the pure-python version of StaticTuple |
33 |
return tuple.__new__(cls, args) |
4679.3.44
by John Arbash Meinel
Special case the empty tuple as a singleton. |
34 |
|
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
35 |
def __init__(self, *args): |
4679.3.41
by John Arbash Meinel
Finish switching the naming to StaticTuple. |
36 |
"""Create a new 'StaticTuple'"""
|
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
37 |
for bit in args: |
4759.2.9
by John Arbash Meinel
Implement support for lots of types. |
38 |
if type(bit) not in (str, StaticTuple, unicode, int, long, float, |
4759.2.8
by John Arbash Meinel
Set up a test suite for hash() and richcompare against lots of acceptable types. |
39 |
None.__class__, bool): |
40 |
raise TypeError('StaticTuple can only point to' |
|
4759.2.9
by John Arbash Meinel
Implement support for lots of types. |
41 |
' StaticTuple, str, unicode, int, long, float, bool, or'
|
42 |
' None not %s' % (type(bit),)) |
|
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
43 |
num_keys = len(args) |
4679.3.42
by John Arbash Meinel
Implement comparison support when using nested StaticTuple objects. |
44 |
if num_keys < 0 or num_keys > 255: |
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
45 |
raise ValueError('must have 1 => 256 key bits') |
4679.3.78
by John Arbash Meinel
Change the pure-python version of StaticTuple |
46 |
# We don't need to pass args to tuple.__init__, because that was
|
47 |
# already handled in __new__.
|
|
48 |
tuple.__init__(self) |
|
49 |
||
4679.3.79
by John Arbash Meinel
Change the repr to print out 'StaticTuple' |
50 |
def __repr__(self): |
51 |
return '%s%s' % (self.__class__.__name__, tuple.__repr__(self)) |
|
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
52 |
|
4759.2.15
by Matt Nordhoff
Add a __reduce__ method to the Python version |
53 |
def __reduce__(self): |
54 |
return (StaticTuple, tuple(self)) |
|
55 |
||
4759.2.2
by John Arbash Meinel
Update _static_tuple_py.py with the same concatenation behavior |
56 |
def __add__(self, other): |
57 |
"""Concatenate self with other"""
|
|
58 |
return StaticTuple.from_sequence(tuple.__add__(self,other)) |
|
59 |
||
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
60 |
def as_tuple(self): |
4789.28.3
by John Arbash Meinel
Add a static_tuple.as_tuples() helper. |
61 |
return tuple(self) |
4679.3.29
by John Arbash Meinel
Start work on implementing a Key.intern() function. |
62 |
|
4679.3.30
by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of: |
63 |
def intern(self): |
4679.3.51
by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code. |
64 |
return _interned_tuples.setdefault(self, self) |
4679.3.30
by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of: |
65 |
|
4739.4.1
by John Arbash Meinel
Implement StaticTuple.from_sequence() |
66 |
@staticmethod
|
67 |
def from_sequence(seq): |
|
68 |
"""Convert a sequence object into a StaticTuple instance."""
|
|
69 |
if isinstance(seq, StaticTuple): |
|
70 |
# it already is
|
|
71 |
return seq |
|
72 |
return StaticTuple(*seq) |
|
73 |
||
74 |
||
4679.3.16
by John Arbash Meinel
Initial work for a Key class. |
75 |
|
4679.5.4
by John Arbash Meinel
Add a comment to help Matthew Nordhoff understand why we have: |
76 |
# Have to set it to None first, so that __new__ can determine whether
|
77 |
# the _empty_tuple singleton has been created yet or not.
|
|
4679.3.44
by John Arbash Meinel
Special case the empty tuple as a singleton. |
78 |
_empty_tuple = None |
79 |
_empty_tuple = StaticTuple() |
|
4679.3.51
by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code. |
80 |
_interned_tuples = {} |