提问人:Sam Zuk 提问时间:7/12/2022 更新时间:7/12/2022 访问量:632
python date/time/datetime 对象的布尔值可以是 False 吗?[复制]
Can python date/time/datetime objects have a boolean value of False? [duplicate]
问:
我最近遇到了一些正在检查日期时间对象的代码,并认为它可以稍微清理一下:
# original
if (datetime1 and (datetime2 is None)):
do_things()
# slightly cleaner version
if (datetime1 and not datetime2):
do_things()
但是我意识到,如果有一个有效的日期时间对象计算为 False,这两个语句就不完全相等了。例如:
if not '':
print('beep')
else:
print('boop')
# output: beep
if '' is None:
print('beep')
else:
print('boop')
# output: boop
在 Python 中查找有关 datetime/time/date 对象的布尔值的信息时,我发现是空的。有谁知道Python是如何处理这个问题的?如果我在不同的对象类型中遇到类似的问题,有没有一种可靠的方法来检查其布尔值是真还是假?
答:
7赞
Barmar
7/12/2022
#1
除非类实现自定义它的 or 方法,否则默认情况下所有类实例都是真实的。如果已定义,则使用它。如果没有,则默认调用;如果它返回非零,则该对象为 truey。__bool__()
__len__()
__bool__()
object.__bool__()
__len__()
该类没有这两种方法,因此所有 datetime 对象都是真实的。因此,您的转换是有效的。datetime.datetime
这记录在 object.__bool__()
中:
调用实现真值测试和内置操作;应返回 False 或 True。如果未定义此方法,则调用该方法(如果已定义),如果对象的结果为非零,则将该对象视为 true。如果一个类既不定义 Nor,则它的所有实例都被视为 true。
bool()
__len__()
__len__()
__bool__()
评论
1赞
Sam Zuk
7/12/2022
我去编写了一个辅助函数来测试一个类是否实现了这一点,并得到了一些奇怪的结果。该函数等效于整数,它确实为整数返回 True,但为字符串返回 False。我还尝试调用这两种类型的对象,并发现相同。lambda x: '__bool__' in dir(type(x))
__bool__()
0赞
pho
7/12/2022
@Sam我认为您可以通过将 lambda 更改为dir()
lambda x: getattr(x, '__bool__', None) is not None
1赞
Barmar
7/12/2022
我的回答是不完整的。它还尝试使用 .@SamZuk__len__()
评论