проверка экземпляра python datetime с датой возвращает true

#python #datetime #isinstance

#python #datetime #isinstance

Вопрос:

У меня есть 2 объекта, один из которых — datetime, а другой — объект date. Когда я хочу проверить тип объекта с помощью isinstance (предпочтительный способ python), я получаю немного абсурдные результаты

 >>> from datetime import date, datetime
>>> a=date.today()
>>> b=datetime.now()
>>> isinstance(a, date)
True
>>> isinstance(a, datetime)
False
>>> isinstance(b, date)
True       # this should be False
>>> isinstance(b, datetime)
True
  

Почему проверка экземпляра объекта datetime с возвращением даты true? В настоящее время я использую type для решения этой проблемы, но не является ли это обходным решением?

 >>> type(a) == date
True
>>> type(a) == datetime
False
>>> type(b) == date
False
>>> type(b) == datetime
True
  

Комментарии:

1. github.com/python/cpython/blob/master/Lib/datetime.py#L1562

Ответ №1:

Почему проверка экземпляра объекта datetime с датой возвращает true

обходного пути нет, он работает по назначению, поскольку datetime является подклассом date , а isinstance возвращает True для подклассов, как говорится в документах. Я думаю, что использование type() — это единственный способ для вас здесь.

 >>> from datetime import datetime, date

>>> datetime.__mro__
(datetime.datetime, datetime.date, object)

>>> issubclass(datetime, date)
True
  

Комментарии:

1. В документации приведена аналогичная информация: docs.python.org/3/library/datetime.html (поиск «Отношения подклассов»).

Ответ №2:

datetime Класс является подклассом date .

Библиотека Python создает это отношение наследования, чтобы вы могли использовать a, datetime где date требуется. Обоснование этого заключается в том, что datetime объект включает в себя дату. Если вы игнорируете время или используете фиксированное время (например, полночь), тогда имеет смысл использовать его как date объект.

В документации упоминается иерархия классов:

Отношения подклассов:

 object
    timedelta
    tzinfo
        timezone
    time
    date
        datetime