Index: third_party/google-endpoints/future/builtins/misc.py |
diff --git a/third_party/google-endpoints/future/builtins/misc.py b/third_party/google-endpoints/future/builtins/misc.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..90dc384ad5dd12a6b27d93721fff21327fbd47bf |
--- /dev/null |
+++ b/third_party/google-endpoints/future/builtins/misc.py |
@@ -0,0 +1,124 @@ |
+""" |
+A module that brings in equivalents of various modified Python 3 builtins |
+into Py2. Has no effect on Py3. |
+ |
+The builtin functions are: |
+ |
+- ``ascii`` (from Py2's future_builtins module) |
+- ``hex`` (from Py2's future_builtins module) |
+- ``oct`` (from Py2's future_builtins module) |
+- ``chr`` (equivalent to ``unichr`` on Py2) |
+- ``input`` (equivalent to ``raw_input`` on Py2) |
+- ``next`` (calls ``__next__`` if it exists, else ``next`` method) |
+- ``open`` (equivalent to io.open on Py2) |
+- ``super`` (backport of Py3's magic zero-argument super() function |
+- ``round`` (new "Banker's Rounding" behaviour from Py3) |
+ |
+``isinstance`` is also currently exported for backwards compatibility |
+with v0.8.2, although this has been deprecated since v0.9. |
+ |
+ |
+input() |
+------- |
+Like the new ``input()`` function from Python 3 (without eval()), except |
+that it returns bytes. Equivalent to Python 2's ``raw_input()``. |
+ |
+Warning: By default, importing this module *removes* the old Python 2 |
+input() function entirely from ``__builtin__`` for safety. This is |
+because forgetting to import the new ``input`` from ``future`` might |
+otherwise lead to a security vulnerability (shell injection) on Python 2. |
+ |
+To restore it, you can retrieve it yourself from |
+``__builtin__._old_input``. |
+ |
+Fortunately, ``input()`` seems to be seldom used in the wild in Python |
+2... |
+ |
+""" |
+ |
+from future import utils |
+ |
+ |
+if utils.PY2: |
+ from io import open |
+ from future_builtins import ascii, oct, hex |
+ from __builtin__ import unichr as chr, pow as _builtin_pow |
+ import __builtin__ |
+ |
+ # Only for backward compatibility with future v0.8.2: |
+ isinstance = __builtin__.isinstance |
+ |
+ # Warning: Python 2's input() is unsafe and MUST not be able to be used |
+ # accidentally by someone who expects Python 3 semantics but forgets |
+ # to import it on Python 2. Versions of ``future`` prior to 0.11 |
+ # deleted it from __builtin__. Now we keep in __builtin__ but shadow |
+ # the name like all others. Just be sure to import ``input``. |
+ |
+ input = raw_input |
+ |
+ from future.builtins.newnext import newnext as next |
+ from future.builtins.newround import newround as round |
+ from future.builtins.newsuper import newsuper as super |
+ from future.types.newint import newint |
+ |
+ _SENTINEL = object() |
+ |
+ def pow(x, y, z=_SENTINEL): |
+ """ |
+ pow(x, y[, z]) -> number |
+ |
+ With two arguments, equivalent to x**y. With three arguments, |
+ equivalent to (x**y) % z, but may be more efficient (e.g. for ints). |
+ """ |
+ # Handle newints |
+ if isinstance(x, newint): |
+ x = long(x) |
+ if isinstance(y, newint): |
+ y = long(y) |
+ if isinstance(z, newint): |
+ z = long(z) |
+ |
+ try: |
+ if z == _SENTINEL: |
+ return _builtin_pow(x, y) |
+ else: |
+ return _builtin_pow(x, y, z) |
+ except ValueError: |
+ if z == _SENTINEL: |
+ return _builtin_pow(x+0j, y) |
+ else: |
+ return _builtin_pow(x+0j, y, z) |
+ |
+ # ``future`` doesn't support Py3.0/3.1. If we ever did, we'd add this: |
+ # callable = __builtin__.callable |
+ |
+ __all__ = ['ascii', 'chr', 'hex', 'input', 'isinstance', 'next', 'oct', |
+ 'open', 'pow', 'round', 'super'] |
+ |
+else: |
+ import builtins |
+ ascii = builtins.ascii |
+ chr = builtins.chr |
+ hex = builtins.hex |
+ input = builtins.input |
+ next = builtins.next |
+ # Only for backward compatibility with future v0.8.2: |
+ isinstance = builtins.isinstance |
+ oct = builtins.oct |
+ open = builtins.open |
+ pow = builtins.pow |
+ round = builtins.round |
+ super = builtins.super |
+ |
+ __all__ = [] |
+ |
+ # The callable() function was removed from Py3.0 and 3.1 and |
+ # reintroduced into Py3.2+. ``future`` doesn't support Py3.0/3.1. If we ever |
+ # did, we'd add this: |
+ # try: |
+ # callable = builtins.callable |
+ # except AttributeError: |
+ # # Definition from Pandas |
+ # def callable(obj): |
+ # return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) |
+ # __all__.append('callable') |