| Index: third_party/google-endpoints/future/types/newlist.py
|
| diff --git a/third_party/google-endpoints/future/types/newlist.py b/third_party/google-endpoints/future/types/newlist.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..74d8f6cebed39c1e4f060d32b7b3077be908f2fb
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/future/types/newlist.py
|
| @@ -0,0 +1,95 @@
|
| +"""
|
| +A list subclass for Python 2 that behaves like Python 3's list.
|
| +
|
| +The primary difference is that lists have a .copy() method in Py3.
|
| +
|
| +Example use:
|
| +
|
| +>>> from builtins import list
|
| +>>> l1 = list() # instead of {} for an empty list
|
| +>>> l1.append('hello')
|
| +>>> l2 = l1.copy()
|
| +
|
| +"""
|
| +
|
| +import sys
|
| +import copy
|
| +
|
| +from future.utils import with_metaclass
|
| +from future.types.newobject import newobject
|
| +
|
| +
|
| +_builtin_list = list
|
| +ver = sys.version_info[:2]
|
| +
|
| +
|
| +class BaseNewList(type):
|
| + def __instancecheck__(cls, instance):
|
| + if cls == newlist:
|
| + return isinstance(instance, _builtin_list)
|
| + else:
|
| + return issubclass(instance.__class__, cls)
|
| +
|
| +
|
| +class newlist(with_metaclass(BaseNewList, _builtin_list)):
|
| + """
|
| + A backport of the Python 3 list object to Py2
|
| + """
|
| + def copy(self):
|
| + """
|
| + L.copy() -> list -- a shallow copy of L
|
| + """
|
| + return copy.copy(self)
|
| +
|
| + def clear(self):
|
| + """L.clear() -> None -- remove all items from L"""
|
| + for i in range(len(self)):
|
| + self.pop()
|
| +
|
| + def __new__(cls, *args, **kwargs):
|
| + """
|
| + list() -> new empty list
|
| + list(iterable) -> new list initialized from iterable's items
|
| + """
|
| +
|
| + if len(args) == 0:
|
| + return super(newlist, cls).__new__(cls)
|
| + elif type(args[0]) == newlist:
|
| + value = args[0]
|
| + else:
|
| + value = args[0]
|
| + return super(newlist, cls).__new__(cls, value)
|
| +
|
| + def __add__(self, value):
|
| + return newlist(super(newlist, self).__add__(value))
|
| +
|
| + def __radd__(self, left):
|
| + " left + self "
|
| + try:
|
| + return newlist(left) + self
|
| + except:
|
| + return NotImplemented
|
| +
|
| + def __getitem__(self, y):
|
| + """
|
| + x.__getitem__(y) <==> x[y]
|
| +
|
| + Warning: a bug in Python 2.x prevents indexing via a slice from
|
| + returning a newlist object.
|
| + """
|
| + if isinstance(y, slice):
|
| + return newlist(super(newlist, self).__getitem__(y))
|
| + else:
|
| + return super(newlist, self).__getitem__(y)
|
| +
|
| + def __native__(self):
|
| + """
|
| + Hook for the future.utils.native() function
|
| + """
|
| + return list(self)
|
| +
|
| + def __nonzero__(self):
|
| + return len(self) > 0
|
| +
|
| +
|
| +__all__ = ['newlist']
|
|
|