Skip to content

Conversation

@vstinner
Copy link
Member

@vstinner vstinner commented Jan 17, 2018

chr() now catchs OverflowError and raises a ValueError exception
instead.

https://bugs.python.org/issue32582

chr() now catchs OverflowError and raises a ValueError exception
instead.
return NULL;
}
PyErr_Clear();
ch = -1;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this line, right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, right. I removed this useless assignment.

My intent was to get a different error message for underflow (< 0) or overflow (> 0). But in fact, the same error message for all cases is just fine.

@vstinner
Copy link
Member Author

Hum, this PR changes the exception type for large float.

Patched:

>>> chr(2.0**32)
ValueError: chr() arg not in range(0x110000)

Python 3.6:

>>> chr(2.0**32)
TypeError: integer argument expected, got float

@zhangyangyu
Copy link
Member

Ahh, yes. And now it could accept small float while not the case before. So still need to call "PyArg_Parse" and catch OverflowError then.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needed updating the chr() documentation an an entry in the What's New document, in the section "Porting to 3.7".

self.assertRaises(ValueError, chr, -1)
self.assertRaises(ValueError, chr, 0x00110000)
self.assertRaises((OverflowError, ValueError), chr, 2**32)
self.assertRaises(ValueError, chr, -2**100)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use 2**1000. It is possible that once Python will run platform with 128-bit C long.

/*[clinic end generated code: output=d34f25b8035a9b10 input=f919867f0ba2f496]*/
{
return PyUnicode_FromOrdinal(i);
int ch = _PyLong_AsInt(i);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is better to use PyLongAsLongAndOverflow().

@@ -0,0 +1,2 @@
The :func:`chr` builtin function now catchs :exc:`OverflowError` and raises
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"catches" -- this is an implementation detail. And I think it is better to not raise and catch it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants