fix(data): 校验早于副作用,补空行;经验写入 pitfalls

save_table 的两处收尾(用户授权代改):

- 后缀校验原先藏在 if/else 分支的 else 里,排在 path.parent.mkdir(...) 之后,
  传 sub/x.txt 会先把 sub\ 建出来再抛 ValueError。改成守卫子句,集中在 mkdir 之前,
  校验段结束后才产生副作用;此时 else 分支自然消失,用回 if/else 两路分派
- __all__ 与下一个 def 之间补回第二个空行(PEP 8 / E302)

测试:
- 新增 test_save_table_validates_before_touching_disk,
  断言参数非法时 tmp_path 下一个条目都不留(ValueError 与 TypeError 两条路径)
- 40 passed / 44 skipped,两套环境一致;ruff All checks passed

文档:
- docs/dev/personal-pitfalls.md 追加条目 5(参数校验排在副作用之后)
  与条目 6(把 lint 的"没报错"当成"没问题"),索引表同步加行
- STATUS:io.py 收尾,L0 第 3 项完成;测试计数 40
- CHANGELOG:Fixed 段补两条
This commit is contained in:
guzhujushi committed 2026-10-01 23:26:47 +08:00
1 parent 19f4a15107
commit 6758e81c9d
5 files changed
+61 -9

No files matched your search

+6 -3
View File
@@ -14,6 +14,7 @@ import pandas as pd
__all__ = ["load_table", "save_table"]
def load_table(path: str | Path, **kwargs: Any) -> pd.DataFrame:
"""按扩展名自动选择读取方式,返回 DataFrame。
@@ -100,12 +101,14 @@ def save_table(df: pd.DataFrame, path: str | Path, index: bool = False, **kwargs
if not isinstance(df,pd.DataFrame):
raise TypeError(f"df 必须是一个pandas DataFrame,但是你上传了{type(df)}")
# 校验必须排在副作用(建目录)之前:否则传个 .txt 会先建出一个空目录再抛错。
if suffix not in ('.csv','.xlsx','.xls'):
raise ValueError(f"不支持的文件后缀:{suffix}")
path.parent.mkdir(parents=True,exist_ok=True)
if suffix == '.csv':
df.to_csv(path,index=index,**kwargs)
elif suffix in ['.xlsx','.xls']:
df.to_excel(path,index=index,**kwargs)
else:
raise ValueError(f"不支持的文件后缀:{suffix}")
df.to_excel(path,index=index,**kwargs)
return path