首页 > 解决方案 > python3.9 vs.python3.6中的timedelta问题

问题描述

我在名为“GPS_Date.py”的文件中有以下类:

import datetime
from math import floor

class GPS_Date(datetime.datetime):

    ref_date = datetime.datetime(1980, 1, 6)

    def __init__(self, year, month, day, hour=0, minute=0, second=0):
        datetime.datetime.__init__(year, month, day, hour, minute, second)

    def gps_week(self):
        difftime = self-self.ref_date
        return floor(difftime.days / 7)

    def day_of_week(self):
        difftime = self-self.ref_date
        return difftime.days % 7

    def day_of_year(self):
        return self.timetuple().tm_yday

    @staticmethod
    def to_GPS_date(date):
        return GPS_Date(date.year, date.month, date.day, date.hour, date.minute, date.second)

    @staticmethod
    def now():
        return GPS_Date.to_GPS_date(datetime.datetime.utcnow())

当我在 python3.6 中运行以下代码时,我得到了正确的解决方案:

import datetime
from GPS_Date import GPS_Date

time_string = '2019-01-01 23:59:30.0'
date_format = '%Y-%m-%d %H:%M:%S.%f'

time_1 = datetime.datetime.strptime(time_string, date_format)

time_2 = GPS_Date.to_GPS_date(time_1)

add_time = time_2 + datetime.timedelta(minutes=30)

但是当我用 python3.9 运行它时,我得到以下错误:

    add_time = time_2 + datetime.timedelta(minutes=30)
TypeError: __init__() takes from 4 to 7 positional arguments but 9 were given

我假设 python3.6 和 python3.9 之间发生了一些变化。我查看了文档,但没有找到任何东西。任何人都可以启发我吗?

标签: pythontypeerrortimedelta

解决方案


datetime.datetimeGPS_Date确实有比帐户(即tzinfo和)更多的参数可以传递fold。为什么这不会在 Python3.6 中爆炸,我不确定。但是您根本不需要覆盖__init__,因为您没有做任何事情:

class GPS_Date(datetime.datetime):

    ref_date = datetime.datetime(1980, 1, 6)

    def gps_week(self):
        difftime = self - self.ref_date
        return floor(difftime.days / 7)

    def day_of_week(self):
        difftime = self - self.ref_date
        return difftime.days % 7

    def day_of_year(self):
        return self.timetuple().tm_yday

    @staticmethod
    def to_GPS_date(date):
        return GPS_Date(date.year, date.month, date.day, date.hour, date.minute, date.second)

    @staticmethod
    def now():
        return GPS_Date.to_GPS_date(datetime.datetime.utcnow())

很好。(另请注意:如果您要执行某些操作,则需要覆盖__new__而不是__init__


推荐阅读