python date/time/datetime 对象的布尔值可以是 False 吗?[复制]

Can python date/time/datetime objects have a boolean value of False? [duplicate]

提问人:Sam Zuk 提问时间:7/12/2022 更新时间:7/12/2022 访问量:632

问:

我最近遇到了一些正在检查日期时间对象的代码,并认为它可以稍微清理一下:

# 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是如何处理这个问题的?如果我在不同的对象类型中遇到类似的问题,有没有一种可靠的方法来检查其布尔值是真还是假?

python-datetime 真实性

评论

0赞 Tomerikoo 7/12/2022
我想这是一个品味问题,但为什么要更改代码呢?对我来说,第一个版本实际上是“更干净”的(或者至少是 clearer)......
0赞 Sam Zuk 7/13/2022
@Tomerikoo除了个人喜好之外,真的没有太多理由更改代码(fwiw 代码是我的)——我的问题不是“我如何处理这种情况”,而是“这两个代码片段是否等效”

答:

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__()