Commit c4607aee authored by Benjamin Peterson's avatar Benjamin Peterson

make the types of None and Ellipsis callable

parent 4f921c2e
...@@ -1343,6 +1343,13 @@ class BuiltinTest(unittest.TestCase): ...@@ -1343,6 +1343,13 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(ValueError, x.translate, b"1", 1) self.assertRaises(ValueError, x.translate, b"1", 1)
self.assertRaises(TypeError, x.translate, b"1"*256, 1) self.assertRaises(TypeError, x.translate, b"1"*256, 1)
def test_construct_singletons(self):
for const in None, Ellipsis:
tp = type(const)
self.assertIs(tp(), const)
self.assertRaises(TypeError, tp, 1, 2)
self.assertRaises(TypeError, tp, a=1, b=2)
class TestSorted(unittest.TestCase): class TestSorted(unittest.TestCase):
def test_basic(self): def test_basic(self):
......
...@@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.3 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Make type(None) and type(Ellipsis) callable. They return the respective
singleton instances.
- Forbid summing bytes in sum(). - Forbid summing bytes in sum().
- Verify the types of AST strings and identifiers provided by the user before - Verify the types of AST strings and identifiers provided by the user before
......
...@@ -1277,6 +1277,16 @@ none_dealloc(PyObject* ignore) ...@@ -1277,6 +1277,16 @@ none_dealloc(PyObject* ignore)
Py_FatalError("deallocating None"); Py_FatalError("deallocating None");
} }
static PyObject *
none_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
PyErr_SetString(PyExc_TypeError, "NoneType takes no arguments");
return NULL;
}
Py_RETURN_NONE;
}
static int static int
none_bool(PyObject *v) none_bool(PyObject *v)
{ {
...@@ -1335,6 +1345,30 @@ static PyTypeObject PyNone_Type = { ...@@ -1335,6 +1345,30 @@ static PyTypeObject PyNone_Type = {
0, /*tp_as_sequence*/ 0, /*tp_as_sequence*/
0, /*tp_as_mapping*/ 0, /*tp_as_mapping*/
0, /*tp_hash */ 0, /*tp_hash */
0, /*tp_call */
0, /*tp_str */
0, /*tp_getattro */
0, /*tp_setattro */
0, /*tp_as_buffer */
Py_TPFLAGS_DEFAULT, /*tp_flags */
0, /*tp_doc */
0, /*tp_traverse */
0, /*tp_clear */
0, /*tp_richcompare */
0, /*tp_weaklistoffset */
0, /*tp_iter */
0, /*tp_iternext */
0, /*tp_methods */
0, /*tp_members */
0, /*tp_getset */
0, /*tp_base */
0, /*tp_dict */
0, /*tp_descr_get */
0, /*tp_descr_set */
0, /*tp_dictoffset */
0, /*tp_init */
0, /*tp_alloc */
none_new, /*tp_new */
}; };
PyObject _Py_NoneStruct = { PyObject _Py_NoneStruct = {
......
...@@ -16,6 +16,17 @@ this type and there is exactly one in existence. ...@@ -16,6 +16,17 @@ this type and there is exactly one in existence.
#include "Python.h" #include "Python.h"
#include "structmember.h" #include "structmember.h"
static PyObject *
ellipsis_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
if (PyTuple_GET_SIZE(args) || (kwargs && PyDict_Size(kwargs))) {
PyErr_SetString(PyExc_TypeError, "EllipsisType takes no arguments");
return NULL;
}
Py_INCREF(Py_Ellipsis);
return Py_Ellipsis;
}
static PyObject * static PyObject *
ellipsis_repr(PyObject *op) ellipsis_repr(PyObject *op)
{ {
...@@ -43,6 +54,24 @@ PyTypeObject PyEllipsis_Type = { ...@@ -43,6 +54,24 @@ PyTypeObject PyEllipsis_Type = {
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */ Py_TPFLAGS_DEFAULT, /* tp_flags */
0, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
ellipsis_new, /* tp_new */
}; };
PyObject _Py_EllipsisObject = { PyObject _Py_EllipsisObject = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment