Skip to content

bpo-32582: chr() doesn't raise OverflowError anymore #5218

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed

bpo-32582: chr() doesn't raise OverflowError anymore #5218

wants to merge 3 commits into from

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".

@@ -304,7 +304,8 @@ def test_chr(self):
self.assertEqual(chr(0x0010FFFF), "\U0010FFFF")
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.

{
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