| Index: third_party/google-endpoints/future/types/newdict.py
|
| diff --git a/third_party/google-endpoints/future/types/newdict.py b/third_party/google-endpoints/future/types/newdict.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5dbcc4b7df064ad525a401791daec452672c0df3
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/future/types/newdict.py
|
| @@ -0,0 +1,111 @@
|
| +"""
|
| +A dict subclass for Python 2 that behaves like Python 3's dict
|
| +
|
| +Example use:
|
| +
|
| +>>> from builtins import dict
|
| +>>> d1 = dict() # instead of {} for an empty dict
|
| +>>> d2 = dict(key1='value1', key2='value2')
|
| +
|
| +The keys, values and items methods now return iterators on Python 2.x
|
| +(with set-like behaviour on Python 2.7).
|
| +
|
| +>>> for d in (d1, d2):
|
| +... assert not isinstance(d.keys(), list)
|
| +... assert not isinstance(d.values(), list)
|
| +... assert not isinstance(d.items(), list)
|
| +"""
|
| +
|
| +import sys
|
| +
|
| +from future.utils import with_metaclass
|
| +from future.types.newobject import newobject
|
| +
|
| +
|
| +_builtin_dict = dict
|
| +ver = sys.version_info[:2]
|
| +
|
| +
|
| +class BaseNewDict(type):
|
| + def __instancecheck__(cls, instance):
|
| + if cls == newdict:
|
| + return isinstance(instance, _builtin_dict)
|
| + else:
|
| + return issubclass(instance.__class__, cls)
|
| +
|
| +
|
| +class newdict(with_metaclass(BaseNewDict, _builtin_dict)):
|
| + """
|
| + A backport of the Python 3 dict object to Py2
|
| + """
|
| + def items(self):
|
| + """
|
| + On Python 2.7+:
|
| + D.items() -> a set-like object providing a view on D's items
|
| + On Python 2.6:
|
| + D.items() -> an iterator over D's items
|
| + """
|
| + if ver == (2, 7):
|
| + return self.viewitems()
|
| + elif ver == (2, 6):
|
| + return self.iteritems()
|
| + elif ver >= (3, 0):
|
| + return self.items()
|
| +
|
| + def keys(self):
|
| + """
|
| + On Python 2.7+:
|
| + D.keys() -> a set-like object providing a view on D's keys
|
| + On Python 2.6:
|
| + D.keys() -> an iterator over D's keys
|
| + """
|
| + if ver == (2, 7):
|
| + return self.viewkeys()
|
| + elif ver == (2, 6):
|
| + return self.iterkeys()
|
| + elif ver >= (3, 0):
|
| + return self.keys()
|
| +
|
| + def values(self):
|
| + """
|
| + On Python 2.7+:
|
| + D.values() -> a set-like object providing a view on D's values
|
| + On Python 2.6:
|
| + D.values() -> an iterator over D's values
|
| + """
|
| + if ver == (2, 7):
|
| + return self.viewvalues()
|
| + elif ver == (2, 6):
|
| + return self.itervalues()
|
| + elif ver >= (3, 0):
|
| + return self.values()
|
| +
|
| + def __new__(cls, *args, **kwargs):
|
| + """
|
| + dict() -> new empty dictionary
|
| + dict(mapping) -> new dictionary initialized from a mapping object's
|
| + (key, value) pairs
|
| + dict(iterable) -> new dictionary initialized as if via:
|
| + d = {}
|
| + for k, v in iterable:
|
| + d[k] = v
|
| + dict(**kwargs) -> new dictionary initialized with the name=value pairs
|
| + in the keyword argument list. For example: dict(one=1, two=2)
|
| + """
|
| +
|
| + if len(args) == 0:
|
| + return super(newdict, cls).__new__(cls)
|
| + elif type(args[0]) == newdict:
|
| + value = args[0]
|
| + else:
|
| + value = args[0]
|
| + return super(newdict, cls).__new__(cls, value)
|
| +
|
| + def __native__(self):
|
| + """
|
| + Hook for the future.utils.native() function
|
| + """
|
| + return dict(self)
|
| +
|
| +
|
| +__all__ = ['newdict']
|
|
|