别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • Python 面试题
  • 2025 面试记录
  • 2022 面试记录
  • 2021 面试记录
  • 2020 面试记录
  • 2019 面试记录
  • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • Python 面试题
  • 2025 面试记录
  • 2022 面试记录
  • 2021 面试记录
  • 2020 面试记录
  • 2019 面试记录
  • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 工作
  • 规范

    • RESTful API 设计规范
    • 探索 Python 配置文件的最佳实践
      • 专用的 py 文件存储
      • JSON
        • 不使用 json 的理由
      • YAML
      • Configparser
      • 可选
      • 总结
        • 横向对比
      • 参考链接
    • HTTP API 设计指南
    • Python PEP-8 编码风格指南中文版
    • Python 语言风格指南
    • 全面理解 Python 中的类型提示(Type Hints)
  • Linux

  • 数据库

  • Git

  • 👨‍💻Web

  • 英语

  • Docker

  • 编辑器

  • 网络

  • 前端

  • 存储

  • 备忘录

  • 如何开始你的单元测试
  • 以程序员的视角看中国——西安篇
  • 💻工作
  • 规范
佚名
2019-05-26
目录

探索 Python 配置文件的最佳实践

首先看几种常见的存储配置文件的方式:

# 专用的 py 文件存储

Python 不是配置格式。 最佳做法不是将这些内容存储在.py 文件中,而是将其存储为 YAML 或 JSON 或 INI 或任何其他格式并加载到其中。如果您需要在程序运行时更改配置,则可以 让线程监视文件描述符中的更改并适当地重新加载配置。

如果您将配置存储在.py 文件中以进行长时间运行(例如,例如 Web 服务器),则基本上需要重新启动整个程序(python 的重装是要使用的屁股上的真正痛苦,并且很多 非常健壮的 Web 框架在 IMO 方面仍然存在很多麻烦。 将其保存在配置文件中还意味着最终用户可以随意更改配置(而代码可能已经预先编译为.pyc 文件中的字节码)。

话虽这么说,如果它是最适合您的变量,并且变量在程序的整个生命周期内都不会改变,则将它们存储在.py 文件中并不是什么大问题。 随着程序的发展,您将不得不重新考虑该问题。我目前正在开发一个程序,该程序将其配置存储在 python 文件中,并且要更改任何内容都非常麻烦。

# JSON

# 不使用 json 的理由

尽管作为基于字符串的人类可读的数据交换格式非常好,但是:

  • 没有注释
  • 逗号太烦人 参见:

Why JSON isn't a Good Configuration Language - Lucidchart (opens new window)

上文翻译:为什么说 JSON 不适合做配置文件? - 简书 (opens new window)

# YAML

YAML 格式被设计为 JSON 的超集,同时更易于手工操作。 YAML 有三个主要问题。

  1. 规范太多:如果打印在 letter 尺寸的纸上,则会有 86 页。这就使得有人可能会使用 YAML 的功能与一个解析器一起工作,而不是另一个解析器。有人建议在一个子集上进行标准化,但这基本上意味着要创建一个特定于该文件的新标准,这个标准是不容易长期处理的。
  2. YAML 默认本身并不安全。该规范允许在处理配置数据时最好避免代码的任意执行。当然可以避免这种行为 - 例如,PyYAML 提供了一个 safe_load 操作 - 但是如果任何工具不小心使用 load,那么它们会自行开启任意代码执行。虽然这个 PEP 专注于构建固有涉及代码执行的项目,但其他配置数据(如项目名称和版本号)最终可能会在相同的文件中随意执行任意代码。
  3. 最后,最流行的 YAML 的 Python 实现是 PyYAML,它是一个包含几千行代码的大型项目,也是一个可选的 C 扩展模块。虽然本身并不一定是个问题,但对于像 pip 这样的项目来说,这更像是一个问题,因为他们很可能需要将 PyYAML 作为依赖项供应商,以便完全独立(否则,最终会导致您安装需要安装工具的工具才能正常工作)。 PyYAML 的一个概念验证重新工作已经完成,看看有多容易的可能供应一个简单版本的库,这表明它是一种可能性。

# Configparser

一个基于 configparser INI 风格配置文件。 不幸的是,没有关于什么 configparser 接受的规范,导致版本之间的支持倾斜。 例如,Python 2.7 中的 ConfigParser 接受的内容与 Python 3 中的 configparser 接受的内容不同。 虽然可以标准化 Python 3 接受的内容,并简单地供应 configparser 模块的 backport,但这确实意味着此 PEP 必须编码,所有项目希望使用 configparser 的 backport 才能使用此 PEP 指定的元数据。 这是过度限制性的,如果有人不知道预期特定版本的 configparser 会导致混淆。

以上对比参考出处:PEP 518 -- Specifying Minimum Build System Requirements for Python Projects | Python.org (opens new window)

# 可选

  • YAML,JSON,ini,XML 用来做配置文件,优缺点分别是什么? - 知乎 (opens new window)
  • HOCON (opens new window)
  • chimpler/pyhocon: HOCON parser for Python (opens new window)

# 总结

# 横向对比

Feature TOML YAML JSON CFG/INI
Well-defined yes yes yes
Real data types yes yes yes
Reliable Unicode yes yes yes
Reliable comments yes yes
Easy for humans to edit yes ?? ??
Easy for tools to edit yes ?? yes ??
In standard library yes yes
Easy for pip to vendor yes n/a n/a

表中的“??”表示大多数人倾向于回答“是”的项目,但实际上由于缺乏明确的规范或由于底层文件格式规范会异常复杂导致答案为否)

pytoml TOML 解析器是约 300 行的纯 Python 代码,因此不在标准库之内就算不上什么特别严重的瑕疵。

Python 文件也被讨论为一种潜在的格式,但是在文件格式审查中并未考虑(因为它们不是常见的预先存在的文件格式)。

# 参考链接

  • Are there any best practices when it comes to configuration files? : Python (opens new window)
  • Configuring Python Projects with INI, TOML, YAML, and ENV files (opens new window)
  • 如何看待 JSON 语法中不能加注释的设计? - 知乎 (opens new window)
编辑 (opens new window)
#Python
上次更新: 2025-05-29, 07:39:39
RESTful API 设计规范
HTTP API 设计指南

← RESTful API 设计规范 HTTP API 设计指南→

最近更新
01
Flask 运行周期及工作原理
06-05
02
支付系统策略模式实现代码
06-04
03
Python 中 OOM(内存泄漏)问题的定位与分析
05-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式