Python 中以逻辑表达式为参数的函数的实现方式
比如大多数的 ORM 都支持如下的用法
Person.select().where(Person.name == 'Dave').get()
, 像这个 where 有什么简洁的实现方式吗?(除了重载 Person.name 的 __eq__ 外)。
另外这个一般是怎么实现的? 谢谢。
Python 中以逻辑表达式为参数的函数的实现方式
3 回复
在Python里,想写一个以逻辑表达式为参数的函数,最直接的办法就是让函数接受一个返回布尔值的可调用对象(比如lambda函数或者普通函数)作为参数。这样调用者就能把复杂的判断逻辑封装起来传给你。
举个例子,假设你要写一个filter_data函数,从列表里筛选出满足特定条件的元素:
def filter_data(data, condition_func):
"""
根据条件函数过滤数据。
参数:
data: 待过滤的列表。
condition_func: 一个接受单个参数并返回布尔值的函数。
返回:
满足条件的新列表。
"""
return [item for item in data if condition_func(item)]
# 使用lambda表达式作为参数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 筛选偶数
even_numbers = filter_data(numbers, lambda x: x % 2 == 0)
print(even_numbers) # 输出: [2, 4, 6, 8, 10]
# 也可以先定义一个普通函数,再传进去
def is_greater_than_five(n):
return n > 5
greater_numbers = filter_data(numbers, is_greater_than_five)
print(greater_numbers) # 输出: [6, 7, 8, 9, 10]
关键点:
这里的condition_func参数就是一个“逻辑表达式”的载体。调用者用lambda x: x % 2 == 0这个匿名函数,或者预定义的is_greater_than_five函数,把逻辑(表达式)传递了进去。函数内部在列表推导式里调用它condition_func(item)来得到True或False,完成筛选。
如果你想允许调用者直接传一个“表达式字符串”然后由你的函数来eval,强烈不建议这么做,因为会有严重的安全风险。用函数对象(callable)的方式是标准、安全且灵活的最佳实践。
总结:传一个返回布尔值的函数进去最靠谱。
看了下 Spark 的实现,是把字段抽象成 Column,再重载 eq ,就只需要写一次了
楼主研究下 ORM 的源码吧。
推荐去看一下 Django 内置的 ORM,比较直接好理解,我阅读过大部分。
或者 peewee 那个就一个文件把 ORM 最基本的东西都实现了。
实在是行有余力可以学 sqlalchemy。

