Python从当前路径读取YAML的自定义函数需重构,问题出在哪里?
现有代码违反的规范与存在的问题
- 类型标注不符合PEP 484规范:函数返回值标注为
Dict,但文件不存在时返回None,实际返回类型应为Optional[Dict],错误的标注会导致类型检查工具误判,也会误导调用方。 - 路径处理逻辑冗余且风格不统一:同时混用
os模块和pathlib两种路径处理库,且Path.cwd()本身已返回当前工作目录的绝对路径,额外调用resolve()属于无意义的冗余操作。 - 未遵循快速失败原则:文件不存在时静默返回
None,调用方如果忘记判空会直接触发后续的空指针异常,问题排查成本更高;同时完全缺失其他异常处理逻辑,比如文件无读权限、YAML格式非法等场景都会直接抛出未捕获的原生异常,错误信息不明确。 - 函数不符合纯函数定义:你原本想按纯函数设计,但该函数依赖当前工作目录这个全局状态,且依赖文件系统的可变状态,相同入参在不同环境下返回结果完全不同,本质是有副作用的函数。
- 编码规范细节问题:
- 打开文件时未指定编码,默认使用系统编码,跨平台运行时可能出现字符乱码
- 文档字符串使用不必要的方括号包裹内容,不符合主流的NumPy/Google风格文档字符串规范
- 可以直接调用
yaml.safe_load()简化写法,无需手动传入SafeLoader参数
标准专业实现方案
版本1:兼容原逻辑(文件不存在返回None)
from typing import Dict, Optional import yaml from pathlib import Path def read_yaml_from_cwd(filename: str, encoding: str = "utf-8") -> Optional[Dict]: """从当前工作目录读取YAML文件 Parameters ---------- filename : str 要读取的YAML文件名,支持.yaml/.yml后缀 encoding : str, optional 文件读取编码,默认为utf-8 Returns ------- Optional[Dict] 读取成功返回YAML解析后的字典,文件不存在返回None Raises ------ PermissionError 文件无读权限时抛出 yaml.YAMLError YAML格式解析失败时抛出 """ file_path = Path.cwd() / filename if not file_path.is_file(): return None with open(file_path, encoding=encoding) as f: return yaml.safe_load(f) if __name__ == "__main__": content = read_yaml_from_cwd("test.yaml") print(content)
版本2:符合快速失败工程实践(文件不存在直接抛异常)
更推荐生产环境使用,不需要调用方额外判空,问题暴露更早,排查成本更低:
from typing import Dict import yaml from pathlib import Path def read_yaml_from_cwd(filename: str, encoding: str = "utf-8") -> Dict: """从当前工作目录读取YAML文件 Parameters ---------- filename : str 要读取的YAML文件名,支持.yaml/.yml后缀 encoding : str, optional 文件读取编码,默认为utf-8 Returns ------- Dict YAML解析后的字典 Raises ------ FileNotFoundError 指定文件不存在时抛出 PermissionError 文件无读权限时抛出 yaml.YAMLError YAML格式解析失败时抛出 """ file_path = Path.cwd() / filename if not file_path.is_file(): raise FileNotFoundError(f"当前工作目录下不存在指定YAML文件: {file_path}") with open(file_path, encoding=encoding) as f: return yaml.safe_load(f) if __name__ == "__main__": content = read_yaml_from_cwd("test.yaml") print(content)
内容的提问来源于stack exchange,提问作者DSGym
相关产品推荐
相关产品推荐

