]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bltinmodule.c: added round(x, [n]); coerce() of two class instances
authorGuido van Rossum <guido@python.org>
Fri, 12 Feb 1993 16:29:05 +0000 (16:29 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 12 Feb 1993 16:29:05 +0000 (16:29 +0000)
will try to coerce anyway.
classobject.c: instance 'nonzero' should first try __nonzero__
only then __len__.

Objects/classobject.c
Python/bltinmodule.c

index 0661e810c86e0e49c52b98c304493fb5bea0b9d0..1e6fdb660afaa6511d86dccdded57985189518ce 100644 (file)
@@ -619,9 +619,9 @@ instance_nonzero(self)
        object *func, *res;
        long outcome;
 
-       if ((func = instance_getattr(self, "__len__")) == NULL) {
+       if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
                err_clear();
-               if ((func = instance_getattr(self, "__nonzero__")) == NULL) {
+               if ((func = instance_getattr(self, "__len__")) == NULL) {
                        err_clear();
                        /* Fall back to the default behavior:
                           all instances are nonzero */
index 85fd58ecee582d4dbc5ac09dabc0e90fa05cc876..97c130353bb7680ee78309ef613eb197960ff509 100644 (file)
@@ -615,6 +615,34 @@ builtin_repr(self, v)
        return reprobject(v);
 }
 
+static object *
+builtin_round(self, args)
+       object *self;
+       object *args;
+{
+       extern double floor PROTO((double));
+       extern double ceil PROTO((double));
+       double x;
+       double f;
+       int ndigits = 0;
+       int sign = 1;
+       int i;
+       if (!getargs(args, "d", &x)) {
+               err_clear();
+               if (!getargs(args, "(di)", &x, &ndigits))
+                       return NULL;
+       }
+       f = 1.0;
+       for (i = ndigits; --i >= 0; )
+               f = f*10.0;
+       for (i = ndigits; ++i <= 0; )
+               f = f*0.1;
+       if (x >= 0.0)
+               return newfloatobject(floor(x*f + 0.5) / f);
+       else
+               return newfloatobject(ceil(x*f - 0.5) / f);
+}
+
 static object *
 builtin_str(self, v)
        object *self;
@@ -674,6 +702,7 @@ static struct methodlist builtin_methods[] = {
        {"raw_input",   builtin_raw_input},
        {"reload",      builtin_reload},
        {"repr",        builtin_repr},
+       {"round",       builtin_round},
        {"setattr",     builtin_setattr},
        {"str",         builtin_str},
        {"type",        builtin_type},
@@ -766,7 +795,7 @@ coerce(pv, pw)
        register object *w = *pw;
        int res;
 
-       if (v->ob_type == w->ob_type) {
+       if (v->ob_type == w->ob_type && !is_instanceobject(v)) {
                INCREF(v);
                INCREF(w);
                return 0;