在Python中,为什么isinstance函数说datetime是datetime.date的一个实例?

mat*_*sco 1 python django timezone datetime isinstance

问题是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
Run Code Online (Sandbox Code Playgroud)

这使得Django 1.4.10(我没有检查其他版本)错误地提出一个RuntimeWarning说一些完全时区感知的日期时间不是,因为有一个规则(这里)说日期实例总是天真的.在django/db/models/fields/init .py,第759行引发警告.可能这是由于对"日期类型的对象总是天真的"这一短语的误解,他们应该使用类型函数比较检查类型而不是使用insinstance(甚至更好,使用django.utils.timezone.is_aware函数).

那么这是一个Django错误,还是bug是关于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
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 7

>>> issubclass(datetime.datetime, datetime.date)
True
Run Code Online (Sandbox Code Playgroud)

datetime是一个子类date,所以datetimes也是dates.

我不确定Django是什么交易.有意义的是,所有不同date的东西datetime都是天真的,但我不确定这是不是真的.