#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