如何阻止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
相关产品推荐
相关产品推荐

