summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Smith <eric@trueblade.com>2008-02-23 03:09:44 (GMT)
committerEric Smith <eric@trueblade.com>2008-02-23 03:09:44 (GMT)
commita73fbe791d0d41db543ebe39d2f6df0a4265be4b (patch)
treea07f32dc9b4de83ec186ee8a06430230edba48c3
parent73d796324242dc2164a0b5943bd08d6252a28651 (diff)
downloadcpython-a73fbe791d0d41db543ebe39d2f6df0a4265be4b.zip
cpython-a73fbe791d0d41db543ebe39d2f6df0a4265be4b.tar.gz
cpython-a73fbe791d0d41db543ebe39d2f6df0a4265be4b.tar.bz2
Added future_builtins, which contains PEP 3127 compatible versions of hex() and oct().
-rw-r--r--Lib/test/test_future_builtins.py27
-rw-r--r--Misc/NEWS8
-rw-r--r--Modules/future_builtins.c69
-rw-r--r--PC/config.c2
-rw-r--r--PCbuild/pythoncore.vcproj4
-rw-r--r--setup.py3
6 files changed, 113 insertions, 0 deletions
diff --git a/Lib/test/test_future_builtins.py b/Lib/test/test_future_builtins.py
new file mode 100644
index 0000000..69e719b
--- /dev/null
+++ b/Lib/test/test_future_builtins.py
@@ -0,0 +1,27 @@
+import test.test_support, unittest
+
+# we're testing the behavior of these future builtins:
+from future_builtins import hex, oct
+
+class BuiltinTest(unittest.TestCase):
+ def test_hex(self):
+ self.assertEqual(hex(0), '0x0')
+ self.assertEqual(hex(16), '0x10')
+ self.assertEqual(hex(16L), '0x10')
+ self.assertEqual(hex(-16), '-0x10')
+ self.assertEqual(hex(-16L), '-0x10')
+ self.assertRaises(TypeError, hex, {})
+
+ def test_oct(self):
+ self.assertEqual(oct(0), '0o0')
+ self.assertEqual(oct(100), '0o144')
+ self.assertEqual(oct(100L), '0o144')
+ self.assertEqual(oct(-100), '-0o144')
+ self.assertEqual(oct(-100L), '-0o144')
+ self.assertRaises(TypeError, oct, ())
+
+def test_main(verbose=None):
+ test.test_support.run_unittest(BuiltinTest)
+
+if __name__ == "__main__":
+ test_main(verbose=True)
diff --git a/Misc/NEWS b/Misc/NEWS
index 5848dba..2921cb2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,14 @@ What's New in Python 2.6 alpha 1?
Core and builtins
-----------------
+- Added the future_builtins module, which contains hex() and oct().
+ These are the PEP 3127 version of these functions, designed to be
+ compatible with the hex() and oct() builtins from Python 3.0. They
+ differ slightly in their output formats from the existing, unchanged
+ Python 2.6 builtins. The expected usage of the future_builtins
+ module is:
+ from future_builtins import hex, oct
+
- Issue #1600: Modifed PyOS_ascii_formatd to use at most 2 digit
exponents for exponents with absolute value < 100. Follows C99
standard. This is a change on Windows, which would use 3 digits.
diff --git a/Modules/future_builtins.c b/Modules/future_builtins.c
new file mode 100644
index 0000000..d5c136a
--- /dev/null
+++ b/Modules/future_builtins.c
@@ -0,0 +1,69 @@
+
+/* future_builtins module */
+
+/* This module provides functions that will be builtins in Python 3.0,
+ but that conflict with builtins that already exist in Python
+ 2.x. */
+
+
+#include "Python.h"
+
+PyDoc_STRVAR(module_doc,
+"This module provides functions that will be builtins in Python 3.0,\n\
+but that conflict with builtins that already exist in Python 2.x.\n\
+\n\
+Functions:\n\
+\n\
+hex(arg) -- Returns the hexidecimal representation of an integer\n\
+oct(arg) -- Returns the octal representation of an integer\n\
+\n\
+The typical usage of this module is to replace existing builtins in a\n\
+module's namespace:\n \n\
+from future_builtins import hex, oct\n");
+
+static PyObject *
+builtin_hex(PyObject *self, PyObject *v)
+{
+ return PyNumber_ToBase(v, 16);
+}
+
+PyDoc_STRVAR(hex_doc,
+"hex(number) -> string\n\
+\n\
+Return the hexadecimal representation of an integer or long integer.");
+
+
+static PyObject *
+builtin_oct(PyObject *self, PyObject *v)
+{
+ return PyNumber_ToBase(v, 8);
+}
+
+PyDoc_STRVAR(oct_doc,
+"oct(number) -> string\n\
+\n\
+Return the octal representation of an integer or long integer.");
+
+
+/* List of functions exported by this module */
+
+static PyMethodDef module_functions[] = {
+ {"hex", builtin_hex, METH_O, hex_doc},
+ {"oct", builtin_oct, METH_O, oct_doc},
+ {NULL, NULL} /* Sentinel */
+};
+
+
+/* Initialize this module. */
+
+PyMODINIT_FUNC
+initfuture_builtins(void)
+{
+ PyObject *m;
+
+ m = Py_InitModule3("future_builtins", module_functions, module_doc);
+ if (m == NULL)
+ return;
+
+ /* any other initialization needed */
+}
diff --git a/PC/config.c b/PC/config.c
index 9961efa..f2d38ae 100644
--- a/PC/config.c
+++ b/PC/config.c
@@ -12,6 +12,7 @@ extern void initaudioop(void);
extern void initbinascii(void);
extern void initcmath(void);
extern void initerrno(void);
+extern void initfuture_builtins(void);
extern void initgc(void);
#ifndef MS_WINI64
extern void initimageop(void);
@@ -84,6 +85,7 @@ struct _inittab _PyImport_Inittab[] = {
{"binascii", initbinascii},
{"cmath", initcmath},
{"errno", initerrno},
+ {"future_builtins", initfuture_builtins},
{"gc", initgc},
#ifndef MS_WINI64
{"imageop", initimageop},
diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj
index 3947074..f721ac7 100644
--- a/PCbuild/pythoncore.vcproj
+++ b/PCbuild/pythoncore.vcproj
@@ -1051,6 +1051,10 @@
>
</File>
<File
+ RelativePath="..\Modules\future_builtins.c"
+ >
+ </File>
+ <File
RelativePath="..\Modules\gcmodule.c"
>
</File>
diff --git a/setup.py b/setup.py
index 4bc6f8c..c643845 100644
--- a/setup.py
+++ b/setup.py
@@ -417,6 +417,9 @@ class PyBuildExt(build_ext):
libraries=math_libs) )
exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
libraries=math_libs) )
+ # code that will be builtins in the future, but conflict with the
+ # current builtins
+ exts.append( Extension('future_builtins', ['future_builtins.c']) )
# random number generator implemented in C
exts.append( Extension("_random", ["_randommodule.c"]) )
# fast iterator tools implemented in C