Как я должен проверить, что данным аргументом является объект 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'
    # ...
16
задан rmh 4 May 2010 в 01:31
поделиться

3 ответа

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

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 ! -)

32
ответ дан 30 November 2019 в 16:18
поделиться

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

5
ответ дан 30 November 2019 в 16:18
поделиться

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

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

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

assert type(arg) == datetime.date
4
ответ дан 30 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: