Unhelpful error message

Thomas Nyberg tomuxiong at gmx.com
Tue Jun 6 14:31:02 EDT 2017


On 06/06/2017 11:22 AM, Skip Montanaro wrote:
> On Tue, Jun 6, 2017 at 12:27 PM, Chris Angelico <rosuav at gmail.com> wrote:
>> Or perhaps showing the repr of the string would be clearer.
> 
> This would definitely be better, I think, and require no special
> casing of the empty string. Still, I doubt this would ever be
> backported for fear of breaking code might be out there somewhere
> which relies on the current behavior. At best, it might be added to
> the next 3.x release (3.7?).
> 
> Skip
> 
Does it make sense to open a bug report? I'm always a bit intimidated by
contributing to python, but the following patch does seem to work
(against a new clone of the master branch):

----------------------
$ git diff
diff --git a/Python/pystrtod.c b/Python/pystrtod.c
index 64d0c52..b3d84e4 100644
--- a/Python/pystrtod.c
+++ b/Python/pystrtod.c
@@ -355,9 +355,15 @@ PyOS_string_to_double(const char *s,
                       "could not convert string to float: "
                       "%.200s", s);
     else if (fail_pos == s)
-        PyErr_Format(PyExc_ValueError,
-                      "could not convert string to float: "
-                      "%.200s", s);
+        if (*s == 0) {
+            PyErr_Format(PyExc_ValueError,
+                          "could not convert string to float: ''");
+        }
+        else {
+            PyErr_Format(PyExc_ValueError,
+                          "could not convert string to float: "
+                          "%.200s", s);
+        }
     else if (errno == ERANGE && fabs(x) >= 1.0 && overflow_exception)
         PyErr_Format(overflow_exception,
                       "value too large to convert to float: "
----------------------

My changes feel a bit hacky. I wanted to just drop a straight repr() in,
but I didn't want to change the code too much since I assume the string
formatting is already there for a reason (e.g. "%.200s").

In any case, that patch seems to be working at first glance:

>>> float('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: ''
>>> float('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'a'
>>> float('1')
1.0

Cheers,
Thomas



More information about the Python-list mailing list