13.1 配置文件的使用场景

    有两种配置文件的使用场景,有些可以添加第3种使用场景,如下两种场景描述得很清楚。

    • 需要编辑一个配置文件。
    • 软件的一个部分需要读配置文件并使用选项和参数来修改它的行为。

    配置文件很少会作为应用程序的主要输入。一个例外的情况是,只是用于模拟时使用配置文件作为主要输入。对于其他大多数情况,配置文件不是主要输入。例如,Web 服务器配置文件是用于定制服务器的行为,但Web请求是主要输入之一,数据库或文件系统是另外的主要输入。在GUI应用中,用户交互事件是一个输入,而文件或数据库可能是另一种输入,配置文件只对应用适当调控。

    在主要输入和配置文件输入之间的界限并不明显。理想情况下,应用程序行为与配置文件内容无关。然而实际上,配置文件会为已有的应用程序带来额外的策略或状态,改变了它的行为。在这种情况下,配置文件就越过了那条线,成为代码的一部分,不仅仅是代码所引用的一个配置。

    第3种可能的场景是在应用完成更新后将配置保存到一个文件。这种保存对象状态的使用并不常见,因为配置文件中保存了程序的操作状态,已经成为了主要输入。这个场景意味着这两种对象已经在文件中合为了一个:配置参数和操作状态的持久化,最好将对象持久化设计成是一种可读性强的格式。

    配置文件会为应用程序提供很多类型的参数值。我们需要适当地对这些不同类型的数据深入理解,然后决定如何最好地表示它们。

    • 默认值。
    • 设备名称,可能与文件系统的位置重叠。
    • 文件系统位置和搜索路径。
    • 限制和边界值。
    • 消息模板和数据格式的指定。
    • 消息文本,所支持的国际化翻译。
    • 网络名称,地址和端口号。
    • 可选行为。
    • 安全键值、标识、用户名和密码。
    • 值域。

    这些值是相对常见的类型:字符串、整型和浮点数。这些值都有简洁的表示并且编辑起来相对容易。对于Python应用解析用户输入来说也很直接。

    在一些情形下,会有一个值的集合。例如,一个值域或路径可能会是简单类型的集合。通常,它是一个简单的序列或元组的序列。通常需要为消息文本使用一种类似字典的映射,应用软件的键可以被映射为自定义的自然语言。

    还有额外的一个配置项,但它的表示并不像简单类型使用了简洁的文本。我们可以把这一项加入之前的列表中。

    • 一些额外的功能、插件和扩展。

      这是有挑战的,因为我们无需为应用程序提供简单的字符串值。配置为应用程序提供了一个对象。当插件包含了更多Python代码时,我们将为安装好的Python模块提供路径,因为它会使用一个名为“package.module.object”的import语句。之后应用程序就可以执行“from package.module import object”代码并使用指定的类或函数。

    对于非Python代码,我们有另外两种技术来完成代码的导入。

    • 对于不能正确执行的二进制程序,会试着使用ctypes模块来调用定义好的API方法。
    • 对于可以执行的二进制程序,可使用subprocess模块提供的一些方式来执行它们。

    这两种技术都不是只针对Python的,关于它们的介绍到此为止,深入介绍就超出了本章的范围。我们会重点关注获取参数值的核心问题,这些值是如何使用的是一个很大的主题。