python - 猴子修补 'datetime' 产生奇怪的结果

标签 python datetime monkeypatching python-datetime

我正在尝试使我的一个库与 Python 2.6 兼容。它使用了在 2.7 中添加的方法 datetime.timedelta.total_seconds,所以为了让它与 2.6 一起工作,我想像这样将它修补成 timedelta:

import datetime

if not hasattr(datetime.timedelta, 'total_seconds'):

    class timedelta(datetime.timedelta):
        def total_seconds(self):
            return self.days * 86400.0 + self.seconds + self.microseconds * 1e-6

    datetime.timedelta = timedelta

这在某些情况下确实有效,例如如果我创建一个 timedelta 变量,它确实有这个方法。但是,如果通过减去两个 datetime.datetime 值生成新的 timedelta 对象,则生成的对象中缺少该方法。

出了什么问题,我该如何解决?

最佳答案

datetime 模块完全用 C 语言编写。

这包括从另一个对象中减去一个 datetime.datetime 对象的函数。该函数——称为 new_delta()——直接实例化 PyDateTime_DeltaType,它是原始的 datetime.timedelta 类(用 C 编写)。它不会注意到您已将 datetime.timedelta 重新绑定(bind)到 Python 领域中您自己的类。

我没有看到任何简单的解决方法。

关于python - 猴子修补 'datetime' 产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7583867/

相关文章:

python - 将具有多个字符串的货币 (£20 5s) 转换为 Float

python - 为 django 模型编写测试用例

.net - 通过 Win 10 Oct 2018 更新,Windows 可以识别闰秒。 .NET 的 DateTime 现在也是吗?

mysql - 在mysql中获取24小时后的日期

python - 如何使用 Mock 从导入的模块修补 'open'

python - 使用 Python 使用特定关键字解析 JSON

python - 为什么导入 Mechanize 会破坏我的 aws ec2 Elastic Beanstalk flask "hello world"python 应用程序?

javascript - 用于解析工作时间字符串的正则表达式模式

ruby - Monkey 在有限范围内修补内置的 ruby​​ 类

python - 猴子从库中修补 python 类方法