Я в настоящее время использую assert
оператор с isinstance
. Поскольку datetime
подкласс date
, Я также должен проверить, что это не экземпляр datetime
. Конечно, существует лучший путь?
from datetime import date, datetime
def some_func(arg):
assert isinstance(arg, date) and not isinstance(arg, datetime),\
'arg must be a datetime.date object'
# ...
Я не понимаю вашу мотивацию отклонения экземпляров подклассов (учитывая, что по определению они поддерживают все поведение, поддерживаемое суперклассом!), Но если это действительно то, на чем вы настаиваете, тогда:
if type(arg) is not datetime.date:
raise TypeError('arg must be a datetime.date, not a %s' % type(arg))
Не используйте assert
, за исключением проверки работоспособности во время разработки (при запуске с python -o
он переходит в режим бездействия) и не вызывает неправильного типа исключения (например, AssertionError
, когда TypeError
явно то, что вы имеете в виду).
Использование isinstance
и последующее исключение одного конкретного подкласса - не лучший способ получить строго определенный точный тип с исключенными подклассами: в конце концов, пользователь вполне может создать подкласс datetime.date
] и добавьте то, чего вы хотите избежать, отклонив в частности экземпляры datetime.datetime
! -)
Если ваша проблема заключается в том, что график становится странным, потому что он использует доли дня, вы можете проверить это другими способами, например, hasattr(arg, 'hour')
различает экземпляр datetime
и экземпляр date
.
Способ Python заключается в том, чтобы не проверять это, а просто идти вперед и позволить вашему коду делать то, что ему нужно, и если у объекта нет требуемого метода или чего-то еще, код потерпит неудачу с исключением в точке, где этот метод будет вызван. Это называется утиная типизация, и это часть того, что делает Python таким гибким.
Теперь, если вы действительно не можете принять объект datetime.datetime
... ну, почему вы не можете? datetime
может делать все, что может делать date
, поэтому я не могу представить, по какой причине вы можете запретить datetime
или вообще любой подкласс date
.
Если у вас действительно действительно есть веская причина сделать это (я полагаю, может быть, в качестве отладочной штуки, но даже тогда я не понимаю...):
assert type(arg) == datetime.date