]> granicus.if.org Git - python/commitdiff
If a float is passed where a int is expected, issue a DeprecationWarning
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>
Tue, 4 Feb 2003 20:59:40 +0000 (20:59 +0000)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>
Tue, 4 Feb 2003 20:59:40 +0000 (20:59 +0000)
instead of raising a TypeError.  Closes #660144 (again).

Misc/NEWS
Python/getargs.c

index a90faa6509f2dcdd97ff8e86f026fd920adb5715..67e84df692f618e624b237953a2b3b0d90ae39db 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -223,9 +223,10 @@ Build
 C API
 -----
 
-- The PyArg_Parse functions now raise a TypeError instead of truncating float
-  arguments if an integer is specified (this affects the 'b', 'B', 'h', 'H',
-  'i', and 'l' codes).
+- The PyArg_Parse functions now issue a DeprecationWarning if a float
+  argument is provided when an integer is specified (this affects the 'b',
+  'B', 'h', 'H', 'i', and 'l' codes).  Future versions of Python will
+  raise a TypeError.
 
 
 New platforms
index 50f6034f5982416659defe039bbb2457d8e3cc41..02897f34a0f26ff0c18604d68379e2ba31c52844 100644 (file)
@@ -387,6 +387,19 @@ converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
 
 #define CONV_UNICODE "(unicode conversion error)"
 
+/* explicitly check for float arguments when integers are expected.  For now
+ * signal a warning.  Returns true if an exception was raised. */
+static int
+float_argument_error(PyObject *arg)
+{
+       if (PyFloat_Check(arg) &&
+           PyErr_Warn(PyExc_DeprecationWarning,
+                      "integer argument expected, got float" ))
+               return 1;
+       else
+               return 0;
+}
+
 /* Convert a non-tuple argument.  Return NULL if conversion went OK,
    or a string with a message describing the failure.  The message is
    formatted as "must be <desired type>, not <actual type>".
@@ -409,8 +422,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
        case 'b': { /* unsigned byte -- very short int */
                char *p = va_arg(*p_va, char *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<b>", arg, msgbuf, bufsize);
@@ -433,8 +446,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
                      values allowed */  
                char *p = va_arg(*p_va, char *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<b>", arg, msgbuf, bufsize);
@@ -456,8 +469,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
        case 'h': {/* signed short int */
                short *p = va_arg(*p_va, short *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<h>", arg, msgbuf, bufsize);
@@ -480,8 +493,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
                       unsigned allowed */ 
                unsigned short *p = va_arg(*p_va, unsigned short *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<H>", arg, msgbuf, bufsize);
@@ -503,8 +516,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
        case 'i': {/* signed int */
                int *p = va_arg(*p_va, int *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<i>", arg, msgbuf, bufsize);
@@ -526,8 +539,8 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
        case 'l': {/* long int */
                long *p = va_arg(*p_va, long *);
                long ival;
-               if (PyFloat_Check(arg))
-                       return converterr("integer", arg, msgbuf, bufsize);
+               if (float_argument_error(arg))
+                       return NULL;
                ival = PyInt_AsLong(arg);
                if (ival == -1 && PyErr_Occurred())
                        return converterr("integer<l>", arg, msgbuf, bufsize);