空的用户定义数据对象的真值
这个问题更像是哲学上的思考。
在Python中,bool([])
的结果是False
,也就是说空列表被认为是“假”。
另一方面,看看下面的代码:
from dataclasses import dataclass
@dataclass
class Lists:
items: list[str]
other_items: list[str]
assert bool(Lists(items=[], other_items=[]))
上面的代码不会引发AssertionError
错误。
这是为什么呢?
我遇到过一种情况,似乎通过汇总一个对象属性的真假值来判断这个对象的真假是有道理的。
在这样做之前,有什么需要注意的地方吗?
(我说的是数据类,比如dataclass
或pydantic.BaseModel
)
1 个回答
2
一个Python类的实例通常是“真”的,除非它实现了__bool__()或__len__()这两个方法。
下面是一个简单的例子:
class FOO():
def __init__(self, x:str|None=None):
self._x = x
def __bool__(self) -> bool:
return self._x is not None
class BAR:
def __init__(self, x:str|None=None):
self._x = x
def __len__(self) -> int:
return 0 if self._x is None else len(self._x)
print(bool(FOO()))
print(bool(FOO("hello")))
print(bool(BAR()))
print(bool(BAR("hello")))
输出:
False
True
False
True