
在 Polars 中,使用 pl.lit(True) 可创建一个恒为真的 pl.Expr 表达式,适用于需返回 pl.Expr 类型的通用过滤函数或类型提示场景,且能正确保留含 null 的所有行。
在 polars 中,使用 `pl.lit(true)` 可创建一个恒为真的 `pl.expr` 表达式,适用于需返回 `pl.expr` 类型的通用过滤函数或类型提示场景,且能正确保留含 `null` 的所有行。
在 Polars 的链式操作与高阶函数(如 filter、自定义辅助函数、类型安全的 API 封装)中,有时需要一个“占位”或“默认启用”的过滤条件——即不实际过滤任何行,包括 null 值。此时,直接写 True 虽然在 filter() 中会被隐式转换并生效,但它不是 pl.Expr 类型,无法满足严格的类型提示(如 Callable[[], pl.Expr])或泛型工具函数的返回要求。
正确的做法是使用 pl.lit(True):它显式构造一个字面量布尔表达式,类型为 polars.expr.Expr,语义清晰、类型安全,且在逻辑计算中恒为 True,因此对所有行(无论值为何、是否为 null)均通过过滤。
import polars as pl
df = pl.DataFrame({
"a": [1, 2, None],
"b": ["x", None, "z"]
})
# ✅ 正确:pl.lit(True) 是 pl.Expr,匹配全部行(含 null)
result = df.filter(pl.lit(True))
print(result)
# shape: (3, 2)
# ┌──────┬──────┐
# │ a ┆ b │
# │ --- ┆ --- │
# │ i64 ┆ str │
# ╞══════╪══════╡
# │ 1 ┆ x │
# │ 2 ┆ null │
# │ null ┆ z │
# └──────┴──────┘⚠️ 注意事项:
- ❌
df.filter(True)虽可运行,但True是 Python 布尔字面量,非pl.Expr,不满足类型注解(如def make_filter() -> pl.Expr:); - ❌
pl.col("a").is_not_null()或pl.lit(1) == pl.lit(1)等虽也恒真,但属冗余表达,语义不如pl.lit(True)直观; - ✅
pl.lit(True)是 Polars 官方推荐的“恒真表达式”惯用写法,兼容所有数据类型和空值语义,且性能开销极小(编译期常量)。
总结:当需要一个类型正确、语义明确、行为稳定的“匹配所有行”过滤表达式时,请始终优先选用 pl.lit(True) ——它是 Polars 生态中表达「无条件通过」最简洁、最规范的 pl.Expr 实现。

















