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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:04