代码之家  ›  专栏  ›  技术社区  ›  Paulo Scardine

在Python中重写运算符+使date+time=datetime

  •  7
  • Paulo Scardine  · 技术社区  · 14 年前

    有没有什么好理由不超载+( MyTime.__radd___ )所以MyDate+MyTime返回MyDateTime?

    6 回复  |  直到 14 年前
        1
  •  12
  •   Eli Courtwright    14 年前

    这通常是不受欢迎的,因为您实际上是在组合而不是添加;这就是为什么实际的datetime库有 combine 方法,而不是以这种方式使用加法。

    <instance of TypeA> + <instance of TypeB> 生产 <instance of TypeC> . 因此 Principle of least astonishment combine 方法而不是重载添加。

        2
  •  16
  •   nosklo    14 年前

    datetime.datetime.combine :

    import datetime
    d = datetime.date(2010, 12, 5)
    t = datetime.time(10, 22, 15)
    dt = datetime.datetime.combine(d, t)
    print dt
    

    印刷品

    2010-12-05 10:22:15
    
        3
  •  4
  •   Ethan Furman    13 年前

    是的,至少有一个很好的理由不这样做:结果实例与两个输入实例完全不同。这很重要吗?我不这么认为--考虑一下 date - date 产量 timedelta .

    • 把两个日期加在一起有意义吗?不。
    • 两次相加有意义吗?不。
    • 把日期和时间加在一起有意义吗?是的!
    • 把时间和时间增量相加有意义吗?也许 吧。

    对于减法

    • 减去两个日期有意义吗?对。
    • 从约会中减去时间有意义吗?不。
    • 从日期中减去时间增量有意义吗?也许 吧。
    • 从时间中减去时间增量有意义吗?也许 吧。

    按照合理的思路发展:

    date + time      => datetime
    date + timedelta => date | datetime or exception or silently drop time portion
    
    time + date => datetime
    time + timedelta => time | wrap-around or exception
    
    date - date      => timedelta
    date - timedelta => date | datetime or exception or silently drop time portion
    
    time - time      => timedelta
    time - timedelta => time | wrap-around or exception
    
    datetime + timedelta => datetime
    datetime - timedelta => datetime
    

    date + time
    date - date
    time - time
    datetime + timedelta
    datetime - timedelta
    

    对于这些:

    date +/- timedelta
    time +/- timedelta
    

    如果timedelta没有其他类型,我将默认返回同一类型;如果timedelta确实有其他类型,我将引发异常,但会有一个设置来控制它。另一种可能的行为是删除不需要的部分——因此,日期与具有小时数的timedelta组合将删除小时数并返回日期。

        4
  •  1
  •   Mark    13 年前

    目前(2.7.2):

    date = date + timedelta
    date = date - timedelta
    timedelta = date - date
    
    datetime = datetime + timedelta
    datetime = datetime - timedelta
    timedelta = datetime - datetime
    

    我认为,延长期限的理由如下:

    timedelta = time - time
    datetime = date + time
    

    我也打算提出以下建议,但是 time 具有非常特定的最小值和最大值 hour , minute second ,和 microsecond ,因此需要对值进行无声的环绕或返回不同类型的值:

    time = time + timedelta
    time = time - timedelta
    

    date 无法处理 timedelta 不到一天的时间。我常常被告知 ,因为这就是目的。 如果那是真的

    [date|datetime] = date + timedelta
    [date|datetime] = date - timedelta
    timedelta = date - date
    
    [time|timedelta] = time + timedelta
    [time|timedelta] = time - timedelta
    timedelta = time - time
    
    datetime = datetime + timedelta
    datetime = datetime - timedelta
    datetime = date + time
    datetime = date - time
    timedelta = datetime - datetime
    timedelta = datetime - date
    
    timedelta = timedelta + timedelta
    timedelta = timedelta - timedelta
    

    在这种情况下 日期 时间增量 ,它将被提升为 datetime . 同样,假设 时间 时间增量 时间增量 然而 [time|timedelta] . 从并行性和精确性的角度考虑接口的其余部分是有意义的,但是我确实认为将时间限制在适当的时间范围内,从而改变所有的 [时间|时间增量] 只是为了 ,但不幸的是,这让我们失去了精确性。

        5
  •  1
  •   japreiss Jim Ingham    13 年前

    concat(concat(concat("Hello", ", "), concat("World", "!")), '\n');
    

    distance = sqrt(add(add(x*x, y*y), z*z));
    

    所以我们重载数学符号来创建更直观的语法。处理这个问题的另一种方法是变量函数,比如 +

    和你的 date + time = datetime datetime + datetime , datetime + time ,或 datetime + date ,所以你永远不会遇到像上面那样的情况。

    DateTime(const Date &d, const Time &t) . 使用Python的动态类型,我猜他们给函数起了个名字, datetime.combine(date, time) ,以便在输入变量的类型在代码中不可见时使代码更清晰。

        6
  •  0
  •   Mp0int    13 年前

    我想最重要的是功能和效率。当然用一个简单的 + 操作员将更容易使用,但我不确定功能。

    datetime.combine ,什么 combine do是:

    dt = date(2011,01,01)
    tm = time(20,00)
    dtm = datetime.combine(dt, tm)
    

    为了 dtm公司

    • 如果 dt 是日期对象,并且 tm 日期 日期 , 信息和 tzinfo公司 是从 商标
    • 如果 是一个 日期时间 对象,而不是它的 tzinfo公司

    datetime 对象似乎不是简单的对象,而是具有不同属性的更复杂的结构,如 时区信息

    也许这就是为什么 日期时间

    Python有一个座右铭(类似的东西):

    在python中,没有什么是不可更改的, 你知道你在做什么。如果没有,最好把图书馆的功能保持原样。。。

    所以,在我看来,你最好用 结合 + 操作人员