配置文件处理

The pip._internal.configuration 模块负责处理(例如,从配置文件加载值并保存值到配置文件)pip 使用的配置文件。该模块的功能主要通过模块的 Configuration 类公开和协调。

注意

本节文档目前正在撰写中。pip 开发者欢迎您帮助完成本节文档。如果您有兴趣帮忙,请在 跟踪问题 中告知我们。

概述

pip 将配置文件存储在标准的操作系统适当位置,这些位置由 appdirs 确定。这些文件采用 INI 格式,并使用 RawConfigParser 处理。

pip 在两个操作中使用配置文件

  • 在处理命令行选项时。

    • 所有配置源读取

  • 作为 pip config 命令的一部分。

    • 所有配置源读取

    • 操作单个配置文件

这两个操作都利用了 Configuration 对象提供的功能,该对象封装了处理配置文件的所有逻辑,并提供了相应的 API。

本节的其余部分介绍了 Configuration 类,并讨论了潜在的未来重构想法。

Configuration

Configuration 从本地环境中的源加载配置值:配置文件和环境变量的组合。

它可以在两种“模式”下使用:从本地环境读取所有值,以及操作单个配置文件。它使用 load_only 属性区分这两种模式,该属性可以是 None 或代表要操作的 kind 配置文件。

The isolated 属性决定加载配置时使用哪些源。如果 isolatedTrue,则不会使用用户特定的配置文件和环境变量。

从本地环境读取

Configuration 可用于从本地环境中的所有配置源读取值,并访问这些值,并按照 配置优先级 部分中描述的优先级逻辑。

对于此用例,Configuration.load_only 属性将为 None,使用的将是以下方法

class Configuration
load()

处理所有与环境的交互,将所有配置数据加载到内存中的对象中。

items()

从已加载的内存中信息提供键值对(如 dict.items()),处理所有覆盖顺序逻辑。

get_value(key)

从已加载的配置中提供给定键的值。已加载的配置可能具有 load_only 为 None 或非 None。这使用与 Configuration.items() 相同的底层机制,并且遵循 配置优先级 中描述的优先级逻辑。

在编写本文档时,代码库中以这种方式使用 Configuration 的部分是:ConfigOptionParser,以便将配置处理透明地包含在命令行处理逻辑中,以及 pip config get,用于在通过 CLI 指定 kind 时打印整个配置。

操作单个配置文件

Configuration 可用于操作单个配置文件,例如添加、更改或删除某些键值对。

对于此用例,load_only 属性将是非 None,并将代表要操作的 kind 配置文件。除了上一节中讨论的方法之外,使用的将是以下方法

class Configuration
get_file_to_edit()

提供“最高优先级”文件,用于由 load_only 指定的 kind 配置文件。这要求 load_only 非 None。

set_value(key, value)

提供一种在 Configuration.get_file_to_edit() 指定的文件中添加/更改单个键值对的方法。

unset_value(key)

提供一种在 Configuration.get_file_to_edit() 指定的文件中删除单个键值对的方法。

save()

将内存中的状态保存到原始文件,将对 Configuration 对象所做的任何修改保存回本地环境。

种类

这是一个枚举,提供值来表示配置的“源”。这包括环境变量和各种类型的配置文件(全局、站点特定、用户特定、通过 PIP_CONFIG_FILE 指定)。

未来重构想法

  • Configuration 类分解为 2 个更小的类,按用例划分
    • Command 用例(只读)-- ConfigurationReader

    • pip config 用例(读/写)-- ConfigurationModifier (继承自 ConfigurationReader)

  • 在加载时急切地填充 Configuration._dictionary