【问题标题】:In Python, why isinstance function says that a datetime is an instance of datetime.date?在 Python 中,为什么 isinstance 函数说 datetime 是 datetime.date 的一个实例?
【发布时间】:2023-03-17 07:53:02
【问题描述】:

问题在于 isinstance 函数说 datetime.datetime 实例也是 datetime.date 的实例

为什么?有道理吗?

Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> d = datetime.datetime(2014, 4, 30, 15, 9, 4, 218466)
>>> isinstance(d, datetime.datetime)
True
>>> isinstance(d, datetime.date)
True

这使得 Django 1.4.10(我没有检查其他版本)错误地引发 RuntimeWarning 说某些完全时区感知的日期时间不是,因为有一条规则 (here) 说日期实例总是幼稚的。在 django/db/models/fields/init.py 的第 759 行中提出了警告。这可能是由于对“日期类型的对象总是幼稚”这句话的误解,他们应该使用 type 函数而不是使用 insinstance 来比较检查类型(或者更好的是,使用 django.utils.timezone.is_aware 函数)。

那么这是一个 Django 错误,还是该错误与 python isinstance 函数的行为有关?或两者?还是只有我?

>>> from django.utils.timezone import is_aware, utc
>>> d = datetime.datetime(2014, 4, 30).replace(tzinfo=utc)
>>> is_aware(d)
True
>>> isinstance(d, datetime.date)
True

【问题讨论】:

    标签: python django datetime timezone isinstance


    【解决方案1】:
    >>> issubclass(datetime.datetime, datetime.date)
    True
    

    datetimedate 的子类,所以所有datetimes 也是dates。

    我不确定 Django 是什么交易。可以说所有dates 不是datetimes 都是幼稚的,但我不确定它是否真的这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多