You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Ruff格式化移除换行?保留多行代码原有格式

Ruff全局保留手动换行的配置方案

问题场景

我有如下Python代码:

import pandas as pd

df = pd.DataFrame(
    {
        "A": [" a: yu", "b: stuff  ", "c: more_stuff"],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df["A"] = (
    df["A"]
    .str.strip()
    .str.replace(":", "")
    .str[0]
)

new_df = pd.melt(
    df,
    id_vars=["A"]
)
print(new_df)

执行命令 ruff format --diff play_line_breaks.py 后,Ruff会将多行链式调用和函数参数合并为单行:

-df["A"] = (
-    df["A"]
-    .str.strip()
-    .str.replace(":", "")
-    .str[0]
-)
+df["A"] = df["A"].str.strip().str.replace(":", "").str[0]
 
-new_df = pd.melt(
-    df,
-    id_vars=["A"]
-)
+new_df = pd.melt(df, id_vars=["A"])
 print(new_df)

我认为多行版本可读性更强,希望全局保留这类手动换行。试过设置 skip-magic-trailing-comma = false 无效,逐段使用# fmt: off/on标记又过于繁琐,想知道Ruff有没有更智能的全局设置方案。

解决方案

可以通过pyproject.toml中的格式化配置,分别针对链式调用和函数参数换行进行全局设置:

1. 保留链式调用的换行

针对pandas这类链式方法调用的换行,添加以下配置:

[tool.ruff.format]
# 强制保留链式调用的手动换行结构
chain-split-on-write = true

如果需要更灵活的控制,可以设置长度阈值,当链式调用单行长度超过指定值时才换行:

[tool.ruff.format]
# 当链式调用单行长度超过80字符时自动换行
chain-max-line-length = 80

2. 保留函数参数的换行

针对pd.melt这类多行参数的函数调用,添加以下配置:

[tool.ruff.format]
# 强制保留函数参数的手动换行结构
argument-split-on-write = true

同样可以设置长度阈值:

[tool.ruff.format]
# 当函数参数单行长度超过80字符时自动换行
argument-max-line-length = 80

3. 完整配置示例

将上述配置组合,pyproject.toml中的相关片段如下:

[tool.ruff]
# 全局行长度限制
line-length = 80

[tool.ruff.format]
# 保留链式调用换行
chain-split-on-write = true
# 保留函数参数换行
argument-split-on-write = true

配置完成后,重新执行ruff format play_line_breaks.py,Ruff就会保留你原来的多行结构,不会再合并为单行。

内容的提问来源于stack exchange,提问作者Cleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:05:54