python - Python lambda 函数缺少 lambda 关键字但仍然有效
问题描述
我正在使用 python 库tinydb
来存储数据。
根据tinydb
文档,示例查询的正确语法是:
User = Query()
db.search(User.birthday.year == 1990)
为什么我们不需要:
User = Query()
db.search(lambda User: User.birthday.year == 1990)
db.search
是一个只被调用一次的函数。这意味着该函数正在接收一个固定值(比较的结果)作为输入,而不是作为比较器的函数?
这个库是如何tinydb
实现这种奇怪的语法的?
解决方案
User.birthday.year
不是真正的int
; 它是一个代表查询以检索int
. 该对象的类型同样定义__eq__
为返回的不是布尔值,而是一个函数,该函数将返回将获取的值int
与 1990 进行比较的结果。
深入研究代码证实了这一点。
Query.__getattr__
返回一个新Query
对象,aUser.birthday.year
也是如此Query
。
的定义Query.__eq__
和Query._generate_test
确认==
也建立了一个新的查询。