Skip to content
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

Fix RecursionError when adding to a DateTime with a FixedTimezone #431

Merged
merged 1 commit into from Jan 25, 2020
Merged

Conversation

pR0Ps
Copy link
Contributor

@pR0Ps pR0Ps commented Jan 2, 2020

This seems to have been caused by bpo-32417. Before that change, adding a timedelta to a date/datetime subclass would always return an instance of date/datetime instead of the subclass. After the change, the subclass is preserved.

The RecursionError was caused by adding a timedelta to a DateTime. Doing this uses the convert method of the DateTime's timezone to convert the new DateTime into the correct timezone. In the case of FixedTimezones, this requires adding the UTC offset of the timezone (a timedelta) to the DateTime, causing the recursion.

Before bpo-32417, the subclass of the DateTime was dropped while calling astimezone. This meant that the object that was passed into fromutc by astimezone was a stdlib datetime, not a Pendulum DateTime. Calling the stdlib datetime's add function would then do the addition and return the result (which would then be upconverted back into a Pendulum DateTime instance). Now, due to the subclass being preserved, the Pendulum DateTime's add function is being called instead, causing the recursion.

This commit fixes the RecursionError by always using the stdlib datetime's addition function to add the offset to the DateTime when calling fromutc.

bpo-32417: https://bugs.python.org/issue32417
commit: python/cpython@89427cd

Fixes #422

This seems to have been caused by `bpo-32417`. Before that change,
adding a timedelta to a date/datetime subclass would always return an
instance of date/datetime instead of the subclass. After the change, the
subclass is preserved.

The RecursionError was caused by adding a timedelta to a DateTime. Doing
this uses the `convert` method of the DateTime's timezone to convert the
new DateTime into the correct timezone. In the case of FixedTimezones,
this requires adding the UTC offset of the timezone (a timedelta) to the
DateTime, causing the recursion.

Before bpo-32417, the subclass of the DateTime was dropped while calling
`astimezone`. This meant that the object that was passed into `fromutc`
by `astimezone` was a stdlib datetime, not a Pendulum DateTime. Calling
the stdlib datetime's add function would then do the addition and return
the result (which would then be upconverted back into a Pendulum
DateTime instance). Now, due to the subclass being preserved, the
Pendulum DateTime's add function is being called instead, causing the
recursion.

This commit fixes the RecursionError by always using the stdlib
datetime's addition function to add the offset to the DateTime when
calling fromutc.

bpo-32417: https://bugs.python.org/issue32417
commit: python/cpython@89427cd

Fixes #422
@sdispater sdispater merged commit e4cbd28 into sdispater:master Jan 25, 2020
3 checks passed
@sdispater
Copy link
Owner

sdispater commented Jan 25, 2020

Thanks a lot for your contribution!

@ErikBjare
Copy link

ErikBjare commented Feb 27, 2020

Will there be a new release that includes this PR anytime soon?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants