]> granicus.if.org Git - python/commitdiff
Changes to long and float by Jeffrey Jasskin to conform to PEP 3141.
authorGuido van Rossum <guido@python.org>
Wed, 1 Aug 2007 18:08:08 +0000 (18:08 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 1 Aug 2007 18:08:08 +0000 (18:08 +0000)
In particular, add trivial implementations of .real, .imag and .conjugate()
to both, and add .numerator and .denominator to long.
Also some small optimizations (e.g. remove long_pos in favor of long_long).

Objects/floatobject.c
Objects/longobject.c

index f2f53bab362ce86adca8040339321331458bd7a5..bf65541108b1a7f166c60485f418ee616572ed8f 100644 (file)
@@ -741,17 +741,6 @@ float_neg(PyFloatObject *v)
        return PyFloat_FromDouble(-v->ob_fval);
 }
 
-static PyObject *
-float_pos(PyFloatObject *v)
-{
-       if (PyFloat_CheckExact(v)) {
-               Py_INCREF(v);
-               return (PyObject *)v;
-       }
-       else
-               return PyFloat_FromDouble(v->ob_fval);
-}
-
 static PyObject *
 float_abs(PyFloatObject *v)
 {
@@ -989,7 +978,15 @@ PyDoc_STRVAR(float_setformat_doc,
 "Overrides the automatic determination of C-level floating point type.\n"
 "This affects how floats are converted to and from binary strings.");
 
+static PyObject *
+float_getzero(PyObject *v, void *closure)
+{
+       return PyFloat_FromDouble(0.0);
+}
+
 static PyMethodDef float_methods[] = {
+       {"conjugate",   (PyCFunction)float_float,       METH_NOARGS,
+        "Returns self, the complex conjugate of any float."},
        {"__getnewargs__",      (PyCFunction)float_getnewargs,  METH_NOARGS},
        {"__getformat__",       (PyCFunction)float_getformat,   
         METH_O|METH_CLASS,             float_getformat_doc},
@@ -998,6 +995,18 @@ static PyMethodDef float_methods[] = {
        {NULL,          NULL}           /* sentinel */
 };
 
+static PyGetSetDef float_getset[] = {
+    {"real", 
+     (getter)float_float, (setter)NULL,
+     "the real part of a complex number",
+     NULL},
+    {"imag", 
+     (getter)float_getzero, (setter)NULL,
+     "the imaginary part of a complex number",
+     NULL},
+    {NULL}  /* Sentinel */
+};
+
 PyDoc_STRVAR(float_doc,
 "float(x) -> floating point number\n\
 \n\
@@ -1012,7 +1021,7 @@ static PyNumberMethods float_as_number = {
        float_divmod,   /*nb_divmod*/
        float_pow,      /*nb_power*/
        (unaryfunc)float_neg, /*nb_negative*/
-       (unaryfunc)float_pos, /*nb_positive*/
+       (unaryfunc)float_float, /*nb_positive*/
        (unaryfunc)float_abs, /*nb_absolute*/
        (inquiry)float_bool, /*nb_bool*/
        0,              /*nb_invert*/
@@ -1073,7 +1082,7 @@ PyTypeObject PyFloat_Type = {
        0,                                      /* tp_iternext */
        float_methods,                          /* tp_methods */
        0,                                      /* tp_members */
-       0,                                      /* tp_getset */
+       float_getset,                           /* tp_getset */
        0,                                      /* tp_base */
        0,                                      /* tp_dict */
        0,                                      /* tp_descr_get */
index 930d07e37e9cc66bbac6379f71a850c2d1b35fb5..36592252f8c2e8c66cdd055692031fe290e64709 100644 (file)
@@ -1985,7 +1985,7 @@ PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
 /* forward */
 static PyLongObject *x_divrem
        (PyLongObject *, PyLongObject *, PyLongObject **);
-static PyObject *long_pos(PyLongObject *);
+static PyObject *long_long(PyObject *v);
 static int long_divrem(PyLongObject *, PyLongObject *,
        PyLongObject **, PyLongObject **);
 
@@ -3180,17 +3180,6 @@ long_invert(PyLongObject *v)
        return (PyObject *)x;
 }
 
-static PyObject *
-long_pos(PyLongObject *v)
-{
-       if (PyLong_CheckExact(v)) {
-               Py_INCREF(v);
-               return (PyObject *)v;
-       }
-       else
-               return _PyLong_Copy(v);
-}
-
 static PyObject *
 long_neg(PyLongObject *v)
 {
@@ -3209,7 +3198,7 @@ long_abs(PyLongObject *v)
        if (Py_Size(v) < 0)
                return long_neg(v);
        else
-               return long_pos(v);
+               return long_long((PyObject *)v);
 }
 
 static int
@@ -3495,12 +3484,6 @@ long_long(PyObject *v)
        return v;
 }
 
-static PyObject *
-long_int(PyObject *v)
-{
-       return long_long(v);
-}
-
 static PyObject *
 long_float(PyObject *v)
 {
@@ -3607,11 +3590,38 @@ long_getnewargs(PyLongObject *v)
        return Py_BuildValue("(N)", _PyLong_Copy(v));
 }
 
+static PyObject *
+long_getN(PyLongObject *v, void *context) {
+       return PyLong_FromLong((intptr_t)context);
+}
+
 static PyMethodDef long_methods[] = {
+       {"conjugate",   (PyCFunction)long_long, METH_NOARGS,
+        "Returns self, the complex conjugate of any int."},
        {"__getnewargs__",      (PyCFunction)long_getnewargs,   METH_NOARGS},
        {NULL,          NULL}           /* sentinel */
 };
 
+static PyGetSetDef long_getset[] = {
+    {"real", 
+     (getter)long_long, (setter)NULL,
+     "the real part of a complex number",
+     NULL},
+    {"imag", 
+     (getter)long_getN, (setter)NULL,
+     "the imaginary part of a complex number",
+     (void*)0},
+    {"numerator", 
+     (getter)long_long, (setter)NULL,
+     "the numerator of a rational number in lowest terms",
+     NULL},
+    {"denominator", 
+     (getter)long_getN, (setter)NULL,
+     "the denominator of a rational number in lowest terms",
+     (void*)1},
+    {NULL}  /* Sentinel */
+};
+
 PyDoc_STRVAR(long_doc,
 "int(x[, base]) -> integer\n\
 \n\
@@ -3629,7 +3639,7 @@ static PyNumberMethods long_as_number = {
                        long_divmod,    /*nb_divmod*/
                        long_pow,       /*nb_power*/
        (unaryfunc)     long_neg,       /*nb_negative*/
-       (unaryfunc)     long_pos,       /*tp_positive*/
+       (unaryfunc)     long_long,      /*tp_positive*/
        (unaryfunc)     long_abs,       /*tp_absolute*/
        (inquiry)       long_bool,      /*tp_bool*/
        (unaryfunc)     long_invert,    /*nb_invert*/
@@ -3639,7 +3649,7 @@ static PyNumberMethods long_as_number = {
                        long_xor,       /*nb_xor*/
                        long_or,        /*nb_or*/
                        0,              /*nb_coerce*/
-                       long_int,       /*nb_int*/
+                       long_long,      /*nb_int*/
                        long_long,      /*nb_long*/
                        long_float,     /*nb_float*/
                        0,              /*nb_oct*/ /* not used */
@@ -3694,7 +3704,7 @@ PyTypeObject PyLong_Type = {
        0,                                      /* tp_iternext */
        long_methods,                           /* tp_methods */
        0,                                      /* tp_members */
-       0,                                      /* tp_getset */
+       long_getset,                            /* tp_getset */
        0,                                      /* tp_base */
        0,                                      /* tp_dict */
        0,                                      /* tp_descr_get */