mirror of
https://github.com/python/cpython.git
synced 2025-11-15 00:00:00 +00:00
If a float is passed where a int is expected, issue a DeprecationWarning
instead of raising a TypeError. Closes #660144 (again).
This commit is contained in:
parent
731098b3ff
commit
5042da6b1e
2 changed files with 29 additions and 15 deletions
|
|
@ -223,9 +223,10 @@ Build
|
||||||
C API
|
C API
|
||||||
-----
|
-----
|
||||||
|
|
||||||
- The PyArg_Parse functions now raise a TypeError instead of truncating float
|
- The PyArg_Parse functions now issue a DeprecationWarning if a float
|
||||||
arguments if an integer is specified (this affects the 'b', 'B', 'h', 'H',
|
argument is provided when an integer is specified (this affects the 'b',
|
||||||
'i', and 'l' codes).
|
'B', 'h', 'H', 'i', and 'l' codes). Future versions of Python will
|
||||||
|
raise a TypeError.
|
||||||
|
|
||||||
|
|
||||||
New platforms
|
New platforms
|
||||||
|
|
|
||||||
|
|
@ -387,6 +387,19 @@ converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
|
||||||
|
|
||||||
#define CONV_UNICODE "(unicode conversion error)"
|
#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,
|
/* Convert a non-tuple argument. Return NULL if conversion went OK,
|
||||||
or a string with a message describing the failure. The message is
|
or a string with a message describing the failure. The message is
|
||||||
formatted as "must be <desired type>, not <actual type>".
|
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 */
|
case 'b': { /* unsigned byte -- very short int */
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<b>", arg, msgbuf, bufsize);
|
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 */
|
values allowed */
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<b>", arg, msgbuf, bufsize);
|
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 */
|
case 'h': {/* signed short int */
|
||||||
short *p = va_arg(*p_va, short *);
|
short *p = va_arg(*p_va, short *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<h>", arg, msgbuf, bufsize);
|
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 allowed */
|
||||||
unsigned short *p = va_arg(*p_va, unsigned short *);
|
unsigned short *p = va_arg(*p_va, unsigned short *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<H>", arg, msgbuf, bufsize);
|
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 */
|
case 'i': {/* signed int */
|
||||||
int *p = va_arg(*p_va, int *);
|
int *p = va_arg(*p_va, int *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<i>", arg, msgbuf, bufsize);
|
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 */
|
case 'l': {/* long int */
|
||||||
long *p = va_arg(*p_va, long *);
|
long *p = va_arg(*p_va, long *);
|
||||||
long ival;
|
long ival;
|
||||||
if (PyFloat_Check(arg))
|
if (float_argument_error(arg))
|
||||||
return converterr("integer", arg, msgbuf, bufsize);
|
return NULL;
|
||||||
ival = PyInt_AsLong(arg);
|
ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<l>", arg, msgbuf, bufsize);
|
return converterr("integer<l>", arg, msgbuf, bufsize);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue