Как я могу изменить поведение datetime .__ add__? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть кодовая база, где эта ошибка может быть довольно часто в ней: добавление timedelta к объекту datetime с учетом часового пояса может привести к объекту datetime, который имеет правильный часовой пояс и правильный момент времени, но неправильное смещение из-за перехода на летнее время.

Я хотел бы перезаписать значение datetime.__add__.Я думал, что подкласс datetime и затем импортирую свой измененный подкласс, но из-за того, что datetime неизменяем, он сложнее, чем я думал.

Вот что я попробовал:

#!/usr/bin/env python

import datetime as dt_orig

# 3rd party
import pytz


class datetime(dt_orig.datetime):
    def __new__(cls, *args, **kwargs):
        tzstring = None
        if 'tzinfo' in kwargs and isinstance(kwargs['tzinfo'], str):
            tzstring = kwargs['tzinfo']
            kwargs['tzinfo'] = dt_orig.timezone.utc
        dt_obj = super().__new__(cls, *args, **kwargs)
        # if tzstring is not None:  # When this is uncommented, it's not the custom datetime class but the standard Python class
        #     dt_obj = dt_obj.astimezone(pytz.timezone(tzstring))
        return dt_obj

    def __add__(self, other):
        if isinstance(other, dt_orig.timedelta):
            tmp = super().__add__(other)  # creates a datetime.datetime
            tmp = tmp.astimezone(pytz.utc).astimezone(tmp.tzinfo)
            return tmp
        else:
            return super().__add__(other)

    __radd__ = __add__

Таким образом, я могу создать пользовательский объект даты и времени, но когда я применяю obj.astimezone(...) (или любой другой метод, например , добавьте * 1013).*) Я получаю обратно datetime.datetime.

Как я могу вернуть свой пользовательский объект даты и времени при сохранении реализации datetime.datetime в большинстве случаев?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...