make the types of None and Ellipsis callable
This commit is contained in:
parent
4f921c2e06
commit
c4607aeedd
@ -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?
|
|||||||
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)
|
|||||||
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 = {
|
|||||||
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.
|
|||||||
#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 = {
|
|||||||
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 = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user