Как проверить, что данный аргумент является объектом datetime.date?

В настоящее время я использую оператор 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'
    # ...

Ответ 1

Я не понимаю вашу мотивацию для отказа от экземпляров подклассов (учитывая, что по определению они поддерживают все поведение, поддерживаемое суперклассом!), но если это действительно то, что вы настаиваете на этом, тогда:

if type(arg) is not datetime.date:
    raise TypeError('arg must be a datetime.date, not a %s' % type(arg))

Не используйте assert за исключением проверки работоспособности во время разработки (при запуске с python -o) он становится нерабочим, и не вызывает неправильного исключения (например, AssertionError, когда a TypeError ясно, что вы здесь имеете в виду).

Использование isinstance, а затем исключение одного конкретного подкласса не является звуковым способом получения строго определенного точного типа с исключенными подклассами: в конце концов, пользователь может отлично подобрать подкласс datetime.date и добавить все, что бы вы ни были избегайте, отклоняя примеры datetime.datetime специально! -)

Ответ 2

Если ваша проблема заключается в том, что график становится неустойчивым, потому что он использует доли дня, вы можете проверить это на другие способы, например. hasattr(arg, 'hour') различает экземпляр datetime и экземпляр date.

Ответ 3

Путь Python - это не проверять его, просто продолжайте и позволяйте вашему коду делать то, что ему нужно, и если у объекта нет требуемого метода или чего-то еще, код не сработает с исключением в точке где этот метод будет вызван. Это называется duck typing, и это часть того, что делает Python настолько гибким.

Теперь, если вы действительно не можете принять объект datetime.datetime... ну, почему вы не можете? A datetime может делать все, что может сделать date, поэтому я не могу представить, какая у вас причина для отказа от datetime или даже любого подкласса date.

Если у вас действительно есть веская причина для этого (я думаю, возможно, это отладочная вещь, но даже тогда я этого не понимаю):

assert type(arg) == datetime.date