我目前正在使用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'
# ...
答案 0 :(得分:32)
我不理解你拒绝子类实例的动机(根据定义,它们支持超类支持的所有行为!),但如果你真的坚持这样做,那么:
if type(arg) is not datetime.date:
raise TypeError('arg must be a datetime.date, not a %s' % type(arg))
除了开发过程中的健全性检查之外,不要使用assert
(当你使用python -o
运行时,它会转为无操作),并且不会引发错误的异常(例如as AssertionError
当TypeError
明显是你的意思时。)
使用isinstance
然后排除一个特定的子类不是一种合理的方法来获得一个严格指定的精确类型,并排除了子类:毕竟,用户可能完全是子类datetime.date
并添加它是什么你应该特别拒绝datetime.datetime
的实例来避免! - )
答案 1 :(得分:5)
如果您的问题是图表因为使用了一天中的一小部分而变得不稳定,您可以通过其他方式对其进行测试,例如: hasattr(arg, 'hour')
区分datetime
实例和date
实例。
答案 2 :(得分:3)
Python的方法不是检查它,只是继续让你的代码做它需要做的事情,如果对象没有必需的方法或什么的,代码将失败,在这一点上有一个例外将调用该方法的位置。这称为duck typing,它是使Python如此灵活的部分原因。
现在,如果你真的不能接受datetime.datetime
对象......那么,为什么不能呢? datetime
可以执行date
可以执行的任何操作,因此我无法想象您有什么理由不允许datetime
或date
的任何子类。
如果你真的有充分的理由这样做(我想可能是一个调试的东西,但即便如此,我也不明白......):
assert type(arg) == datetime.date