| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
| PyObject *result_pair = NULL; | ||
|
|
||
| denominator = PyLong_FromLong(1); | ||
| result_pair = PyTuple_Pack(2, self, denominator); |
There was a problem hiding this comment.
If PyLong_FromLong returns NULL then PyTuple_Pack and Py_DECREF(denominator) will fail.
Sorry, something went wrong.
There was a problem hiding this comment.
I think the whole function can be replaced with return PyTuple_Pack(2, self, _PyLong_One).
Sorry, something went wrong.
There was a problem hiding this comment.
@pablogsal But PyLong_FromLong always receive the 1. How could it fail?
Sorry, something went wrong.
There was a problem hiding this comment.
The contract of PyLong_FromLong says that it can return NULL on failure. Even if the current implementation (that uses the array of small ints) makes it improbable/impossible to fail, this can change in the future without changing the external API.
Sorry, something went wrong.
| Return a pair of integers, whose ratio is exactly equal to the original int | ||
| and with a positive denominator. | ||
|
|
||
| Raise OverflowError on infinities and a ValueError on NaNs. |
There was a problem hiding this comment.
An int can never be any of these things - remove this line
Sorry, something went wrong.
There was a problem hiding this comment.
Yes. math.inf is float class
Sorry, something went wrong.
| def test_as_integer_ratio(self): | ||
| tests = [10, 0, -10, 1, 3] | ||
| for value in tests: | ||
| self.assertEqual((value).as_integer_ratio(), (value, 1)) |
There was a problem hiding this comment.
nit: no parens needed around value
Sorry, something went wrong.
| Return a pair of integers whose ratio is exactly equal to the original integer | ||
| and with a positive denominator. The integer ratio of integers (whole numbers) | ||
| is always the integer as the numerator and 1 as the denominator. | ||
|
|
There was a problem hiding this comment.
A versionadded directive needs to be added. Also, the developer's guide states that reST files should use an indentation of 3 spaces.
Sorry, something went wrong.
| int_as_integer_ratio_impl(PyObject *self) | ||
| /*[clinic end generated code: output=e60803ae1cc8621a input=ce9c7768a1287fb9]*/ | ||
| { | ||
| return PyTuple_Pack(2, self, _PyLong_One) |
There was a problem hiding this comment.
There's a missing semicolon at the end of this line; I think that's why the continuous integration builds are failing.
Also, please change the indentation of this line to 4 spaces instead of 2 spaces, following PEP7. Thanks!
Sorry, something went wrong.
|
@lisroach Thanks for the update. I've pushed a commit that should fix the failing test_doctest. |
Sorry, something went wrong.
There was a problem hiding this comment.
@lisroach If you're okay with my recent updates, I think this PR is ready to merge.
Sorry, something went wrong.
| int_as_integer_ratio_impl(PyObject *self) | ||
| /*[clinic end generated code: output=e60803ae1cc8621a input=c1aea0aa6fb85c28]*/ | ||
| { | ||
| return PyTuple_Pack(2, self, _PyLong_One); |
There was a problem hiding this comment.
True.as_integer_ratio() will return (True, 1). It should return (1, 1).
Sorry, something went wrong.
There was a problem hiding this comment.
Hmm; good point. There's a precedent here in the form of True.numerator, which returns 1.
Sorry, something went wrong.
| Return a pair of integers, whose ratio is exactly equal to the original int | ||
| and with a positive denominator. | ||
|
|
||
| >>> (10).as_integer_ratio() |
There was a problem hiding this comment.
Do we need so much examples in a docstring?
Sorry, something went wrong.
There was a problem hiding this comment.
I think it's useful to have at least one positive and one negative example, so that it's obvious at a glance that the behaviour for negatives is to give (for example) (-5, 1) rather than (5, -1). I could imagine users thinking that 0 was somehow a special case, too, so I like that we have the 0 example there.
Sorry, something went wrong.
| self.assertEqual(type(value >> shift), int) | ||
|
|
||
| def test_as_integer_ratio(self): | ||
| tests = [10, 0, -10, 1, 3] |
There was a problem hiding this comment.
Why so much similar cases are needed?
Add tests for booleans and other int subclasses. Check types of numerator and denominator.
Sorry, something went wrong.
|
|
||
| Return a pair of integers whose ratio is exactly equal to the original | ||
| integer and with a positive denominator. The integer ratio of integers | ||
| (whole numbers) is always the integer as the numerator and 1 as the |
There was a problem hiding this comment.
``1``
Sorry, something went wrong.
There was a problem hiding this comment.
Changing my approval due to the issues Serhiy noted. @lisroach do you want to tackle the outstanding comments? I'm happy to pick this up if not.
Sorry, something went wrong.
|
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request. |
Sorry, something went wrong.
|
I have made the requested changes; please review again. I am not sure if I could do the boolean check better- somehow in one line? I'm open to advice! Thanks for all the reviews @mdickinson and @serhiy-storchaka it's been really helpful! |
Sorry, something went wrong.
|
@eric-wieser I believe Serhiy's thinking is correct, it should be (1, 1). >>> class Int(int):
... pass
...
>>> x = Int(42)
>>> type(+x)
<class 'int'>
>>> type(+True)
<class 'int'> |
Sorry, something went wrong.
| class Foo(enum.IntEnum): | ||
| X = 42 | ||
| self.assertEqual(Foo.X.as_integer_ratio(), (42, 1)) | ||
| assert(type(Foo.X.as_integer_ratio()[0] == int)) |
There was a problem hiding this comment.
This should be: self.assertEqual(type(Foo.X.as_integer_ratio()[0], int). Unittest doesn't use assertion statements.
Sorry, something went wrong.
| return PyTuple_Pack(2, self, _PyLong_One); | ||
| else { | ||
| PyObject *temp = PyNumber_Positive(self); | ||
| Py_DECREF(temp); |
There was a problem hiding this comment.
The DECREF needs to occur after building the tuple; otherwise, the Python integer object can (and likely will) disappear before it gets used.
Sorry, something went wrong.
| if PyLong_CheckExact(self) | ||
| return PyTuple_Pack(2, self, _PyLong_One); | ||
| else { | ||
| PyObject *temp = PyNumber_Positive(self); |
There was a problem hiding this comment.
We need another way to do this. The intent of this code is to construct a regular integer instance from an instance of an int subclass. The problem with PyNumber_Positive() is that the subclass can itself define pos() to return something other than an exact int. Elsewhere, we use _PyLong_Copy for this purpose.
Sorry, something went wrong.
There was a problem hiding this comment.
Is there a reason why PyNumber_Index does not call _PyLong_Copy?
Sorry, something went wrong.
|
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request. |
Sorry, something went wrong.
Am checking to see the Serhiy's issues are resolved.
|
Reviving a comment hidden away above - should operator.index / PyNumber_Index / int->tp_as_number->nb_index call _PyLong_Copy too for consistency? |
Sorry, something went wrong.
| { | ||
| if PyLong_CheckExact(self) { | ||
| return PyTuple_Pack(2, self, _PyLong_One); | ||
| } else { |
There was a problem hiding this comment.
else { should be on the next line per PEP 7.
Sorry, something went wrong.
There was a problem hiding this comment.
Missing parens on the if too
Sorry, something went wrong.
Despite the missing null check and invalid C syntax that works only because of a macro? |
Sorry, something went wrong.
|
Eric, I didn't see your comments prior to merging. See PR 9297 for the cleanup. The part that was fine as-is was using PyTuple_Pack() on two different code paths. |
Sorry, something went wrong.
|
Agreed, the two code paths thing was unimportant. #9297 seems to address all my comments, other than the question about nb_index, which is tangential anyway |
Sorry, something went wrong.
|
Can you note your review on 9297 please. |
Sorry, something went wrong.
|
If that's aimed at me, I don't know what you're asking me to do. |
Sorry, something went wrong.
There was a problem hiding this comment.
This PR was merged too soon. There are several issues with it. See also comments by @sir-sigurd and @eric-wieser.
Sorry, something went wrong.
| self.assertEqual(False.as_integer_ratio(), (0, 1)) | ||
| assert(type(True.as_integer_ratio()[0]) == int) | ||
| assert(type(False.as_integer_ratio()[0]) == int) | ||
| self.assertEqual(type(True.as_integer_ratio()[0]), int) |
There was a problem hiding this comment.
Test also the denumerator type.
Sorry, something went wrong.
| if PyLong_CheckExact(self) { | ||
| return PyTuple_Pack(2, self, _PyLong_One); | ||
| } else { | ||
| PyObject *numerator = _PyLong_Copy(self); |
There was a problem hiding this comment.
Use the same same code as for for the numerator getter.
Test the result for NULL.
Sorry, something went wrong.
| was lifted. | ||
| (Contributed by Serhiy Storchaka in :issue:`32489`.) | ||
|
|
||
| * The ``int`` type now has a new ``as_integer_ratio`` method compatible |
There was a problem hiding this comment.
Add links:
:class:`int`
:meth:`~int.as_integer_ratio`
:meth:`float.as_integer_ratio`
Sorry, something went wrong.
This is a different issue. And I think that it should not. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Adding as_integer_ratio to ints to make them more interoperable with floats.
https://bugs.python.org/issue33073