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

Я сейчас использую оператор 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'
    # ...

Ответы [ 3 ]

32 голосов
/ 04 мая 2010

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

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 специально! -)

5 голосов
/ 04 мая 2010

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

3 голосов
/ 04 мая 2010

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

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

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

assert type(arg) == datetime.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...