diff options
author | Eric Smith <eric@trueblade.com> | 2008-02-23 03:09:44 (GMT) |
---|---|---|
committer | Eric Smith <eric@trueblade.com> | 2008-02-23 03:09:44 (GMT) |
commit | a73fbe791d0d41db543ebe39d2f6df0a4265be4b (patch) | |
tree | a07f32dc9b4de83ec186ee8a06430230edba48c3 | |
parent | 73d796324242dc2164a0b5943bd08d6252a28651 (diff) | |
download | cpython-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.py | 27 | ||||
-rw-r--r-- | Misc/NEWS | 8 | ||||
-rw-r--r-- | Modules/future_builtins.c | 69 | ||||
-rw-r--r-- | PC/config.c | 2 | ||||
-rw-r--r-- | PCbuild/pythoncore.vcproj | 4 | ||||
-rw-r--r-- | setup.py | 3 |
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) @@ -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> @@ -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 |