Polars中eval_binary_same_type!输出None的含义与成因咨询
eval_binary_same_type!(...) = None日志 这条日志是Polars内部逻辑计划优化器的调试输出,来自polars-plan/src/logical_plan/optimizer/simplify_expr.rs文件的第456行。它的含义是:优化器尝试在逻辑计划阶段简化你的二元表达式(比如加法),但无法找到可行的简化规则,最终返回None并打印这条调试信息。
对应你的三个场景逐一解释:
第一个加法表达式输出两条日志
pl.col("a").dt.year()返回i64类型,pl.col("b").dt.month()返回u32类型(月份取值范围1-12,无负数),二者类型不匹配。优化器会先执行类型提升(把u32转为i64),这个过程中会两次触发eval_binary_same_type宏:第一次处理原始的跨类型加法,第二次处理类型统一后的同类型加法。但两次都没法做静态简化(比如没法把列运算简化成常量,因为列值是动态的),所以输出两条日志。强制转成Int32后仍输出一条日志
你把两个列都强制转为Int32后,类型已经统一,优化器只需要触发一次eval_binary_same_type尝试简化。但因为是两个动态列的加法,无法在逻辑计划阶段简化为更简单的表达式(比如常量),所以返回None并打印一条日志。减法无日志输出
这是Polars内部优化逻辑的差异:减法对应的eval_binary_same_type处理分支,没有触发这条调试日志的输出条件,并不是减法表达式被成功简化了。本质上减法和加法一样,都是动态列之间的运算,没法在逻辑计划阶段简化,只是优化器没打印这条调试信息而已。
日志的影响与解决办法
这条日志完全不影响计算结果的正确性和运行性能,只是开发阶段的临时调试输出(后续正式版本可能会移除)。如果觉得日志干扰,可以通过以下方式关闭:
- 调整Polars的日志级别:
import logging logging.getLogger("polars").setLevel(logging.WARNING) - 或者禁用流式模式(部分场景下会减少调试日志):
pl.set_streaming_mode(False)
内容的提问来源于stack exchange,提问作者lebesgue

