mirror of https://github.com/python/cpython
Make bin() implementation parallel oct() and hex() so that int/long subclasses can override or so that other classes can support.
This commit is contained in:
parent
e0f124495b
commit
e3ae655edf
|
@ -267,6 +267,9 @@ typedef struct {
|
||||||
|
|
||||||
/* Added in release 2.5 */
|
/* Added in release 2.5 */
|
||||||
unaryfunc nb_index;
|
unaryfunc nb_index;
|
||||||
|
|
||||||
|
/* Added in release 2.6 */
|
||||||
|
unaryfunc nb_bin;
|
||||||
} PyNumberMethods;
|
} PyNumberMethods;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -523,7 +523,7 @@ class SizeofTest(unittest.TestCase):
|
||||||
len_typeobject = p + 2*l + 15*p + l + 4*p + l + 9*p +\
|
len_typeobject = p + 2*l + 15*p + l + 4*p + l + 9*p +\
|
||||||
l + 11*p + self.align(4)
|
l + 11*p + self.align(4)
|
||||||
self.check_sizeof(class_newstyle,
|
self.check_sizeof(class_newstyle,
|
||||||
h + len_typeobject + 41*p + 10*p + 3*p + 6*p)
|
h + len_typeobject + 42*p + 10*p + 3*p + 6*p)
|
||||||
|
|
||||||
def test_specialtypes(self):
|
def test_specialtypes(self):
|
||||||
i = self.i
|
i = self.i
|
||||||
|
|
|
@ -4,6 +4,15 @@ Python News
|
||||||
|
|
||||||
(editors: check NEWS.help for information about editing NEWS using ReST.)
|
(editors: check NEWS.help for information about editing NEWS using ReST.)
|
||||||
|
|
||||||
|
What's New in Python 2.6 beta 2?
|
||||||
|
================================
|
||||||
|
|
||||||
|
Core and Builtins
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
- Make bin() implementation parallel oct() and hex().
|
||||||
|
|
||||||
|
|
||||||
What's New in Python 2.6 beta 1?
|
What's New in Python 2.6 beta 1?
|
||||||
================================
|
================================
|
||||||
|
|
||||||
|
|
|
@ -933,6 +933,12 @@ int_float(PyIntObject *v)
|
||||||
return PyFloat_FromDouble((double)(v -> ob_ival));
|
return PyFloat_FromDouble((double)(v -> ob_ival));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
int_bin(PyObject *v)
|
||||||
|
{
|
||||||
|
return PyNumber_ToBase(v, 2);
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
int_oct(PyIntObject *v)
|
int_oct(PyIntObject *v)
|
||||||
{
|
{
|
||||||
|
@ -1231,6 +1237,7 @@ static PyNumberMethods int_as_number = {
|
||||||
0, /* nb_inplace_floor_divide */
|
0, /* nb_inplace_floor_divide */
|
||||||
0, /* nb_inplace_true_divide */
|
0, /* nb_inplace_true_divide */
|
||||||
(unaryfunc)int_int, /* nb_index */
|
(unaryfunc)int_int, /* nb_index */
|
||||||
|
(unaryfunc)int_bin, /* nb_bin */
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject PyInt_Type = {
|
PyTypeObject PyInt_Type = {
|
||||||
|
|
|
@ -3300,6 +3300,12 @@ long_float(PyObject *v)
|
||||||
return PyFloat_FromDouble(result);
|
return PyFloat_FromDouble(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
long_bin(PyObject *v)
|
||||||
|
{
|
||||||
|
return PyNumber_ToBase(v, 2);
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
long_oct(PyObject *v)
|
long_oct(PyObject *v)
|
||||||
{
|
{
|
||||||
|
@ -3540,6 +3546,7 @@ static PyNumberMethods long_as_number = {
|
||||||
0, /* nb_inplace_floor_divide */
|
0, /* nb_inplace_floor_divide */
|
||||||
0, /* nb_inplace_true_divide */
|
0, /* nb_inplace_true_divide */
|
||||||
long_long, /* nb_index */
|
long_long, /* nb_index */
|
||||||
|
long_bin, /* nb_bin */
|
||||||
};
|
};
|
||||||
|
|
||||||
PyTypeObject PyLong_Type = {
|
PyTypeObject PyLong_Type = {
|
||||||
|
|
|
@ -3743,6 +3743,7 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base)
|
||||||
if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
|
if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
|
||||||
COPYNUM(nb_index);
|
COPYNUM(nb_index);
|
||||||
}
|
}
|
||||||
|
COPYNUM(nb_hex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
|
if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
|
||||||
|
@ -5135,6 +5136,7 @@ slot_nb_coerce(PyObject **a, PyObject **b)
|
||||||
SLOT0(slot_nb_int, "__int__")
|
SLOT0(slot_nb_int, "__int__")
|
||||||
SLOT0(slot_nb_long, "__long__")
|
SLOT0(slot_nb_long, "__long__")
|
||||||
SLOT0(slot_nb_float, "__float__")
|
SLOT0(slot_nb_float, "__float__")
|
||||||
|
SLOT0(slot_nb_bin, "__bin__")
|
||||||
SLOT0(slot_nb_oct, "__oct__")
|
SLOT0(slot_nb_oct, "__oct__")
|
||||||
SLOT0(slot_nb_hex, "__hex__")
|
SLOT0(slot_nb_hex, "__hex__")
|
||||||
SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
|
SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
|
||||||
|
@ -5802,6 +5804,8 @@ static slotdef slotdefs[] = {
|
||||||
"long(x)"),
|
"long(x)"),
|
||||||
UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
|
UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
|
||||||
"float(x)"),
|
"float(x)"),
|
||||||
|
UNSLOT("__bin__", nb_bin, slot_nb_bin, wrap_unaryfunc,
|
||||||
|
"bin(x)"),
|
||||||
UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
|
UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
|
||||||
"oct(x)"),
|
"oct(x)"),
|
||||||
UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
|
UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
|
||||||
|
|
|
@ -211,7 +211,24 @@ Deprecated since release 2.3. Instead, use the extended call syntax:\n\
|
||||||
static PyObject *
|
static PyObject *
|
||||||
builtin_bin(PyObject *self, PyObject *v)
|
builtin_bin(PyObject *self, PyObject *v)
|
||||||
{
|
{
|
||||||
return PyNumber_ToBase(v, 2);
|
PyNumberMethods *nb;
|
||||||
|
PyObject *res;
|
||||||
|
|
||||||
|
if ((nb = v->ob_type->tp_as_number) == NULL ||
|
||||||
|
nb->nb_hex == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"bin() argument can't be converted to hex");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
res = (*nb->nb_bin)(v);
|
||||||
|
if (res && !PyString_Check(res)) {
|
||||||
|
PyErr_Format(PyExc_TypeError,
|
||||||
|
"__bin__ returned non-string (type %.200s)",
|
||||||
|
res->ob_type->tp_name);
|
||||||
|
Py_DECREF(res);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(bin_doc,
|
PyDoc_STRVAR(bin_doc,
|
||||||
|
|
Loading…
Reference in New Issue