第一步是选择配置文件的格式:INI、JSON、YAML或TOML。有时一个程序需要足够多的参数,以至于将它们全部作为命令行参数或环境变量既不愉快也不可行。在这些情况下,您将需要使用配置文件。有几种流行的配置文件格式。其中包括古老的(尽管有时定义不明确)INI格式、流行但有时难以手写的JSON格式、广泛使用但有时令人惊讶的YAML格式细节,以及许多人不了解的更新格式听说过。TOML。您的首要任务是选择一种格式,然后记录该选择。完成这个简单的部分后,就可以解析配置了。有时在配置中有一个对应于“抽象”数据的类是个好主意。由于此代码不对配置执行任何操作,因此它是显示解析逻辑的最简单方法。想象一下文件处理器的配置:它由一个输入目录、一个输出目录和要提取的文件组成。配置类的抽象定义可能如下所示:from__future__importannotationsimportattr@attr.frozenclassConfiguration:@attr.frozenclassFiles:input_dir:stroutput_dir:strfiles:Files@attr.frozenclassParameters:patterns:List[str]parameters:Parameters为了使特定于格式的代码更简单,您还需要编写一个函数来从字典中解析这个类。请注意,这假定配置将使用破折号,而不是下划线。这种差异并不少见。defconfiguration_from_dict(详细信息):files=Configuration.Files(input_dir=details["files"]["input-dir"],output_dir=details["files"]["output-dir"],)parameters=Configuration.Paraneters(patterns=details["parameters"]["patterns"])returnConfiguration(files=files,parameters=parameters,)JSONJSON(JavaScriptObjectNotation)是一种类似于JavaScript的格式。这是JSON格式的示例配置:json_config="""{"files":{"input-dir":"inputs","output-dir":"outputs"},"parameters":{"patterns":["*.txt","*.md"]}}"""解析逻辑使用json模块将JSON解析成Python内置的数据结构(字典、列表、字符串),然后从字典创建类:importjsondefconfiguration_from_json(data):parsed=json.loads(data)returnconfiguration_from_dict(parsed)INIINI格式,最初只在Windows上流行,后来成为配置标准格式。这与INI的配置相同:ini_config=""[files]input-dir=inputsoutput-dir=outputs[parameters]patterns=['*.txt','*.md']"""Python可以使用内置的-inconfigparser模块解析它。解析器充当类似字典的对象,因此可以直接传递给configuration_from_dict:扩展,旨在更易于手动编写。这在一定程度上是通过制定非常长的规范来实现的。这是YAML中的相同配置:yaml_config="""files:input-dir:inputsoutput-dir:outputparameters:patterns:-'*.txt'-'*.md'"""要让Python解析它,你需要安装第三方模块。最流行的是PyYAML(pipinstallpyyaml)。YAML解析器还返回可传递给configuration_from_dict的内置Python数据类型。但是,YAML解析器需要字节流,因此您需要将字符串转换为字节流。importioimportyamldefconfiguration_from_yaml(data):fp=io.StringIO(data)parsed=yaml.safe_load(fp)returnconfiguration_from_dict(parsed)TOMLTOML(Tom'sOwnMarkupLanguage)旨在成为YAML的轻量级替代品。它的规范比较简短,在某些地方已经流行起来(例如,Rust的包管理器Cargo使用它来进行包配置)。这与TOML的配置相同:toml_config="""[files]input-dir="inputs"output-dir="outputs"[parameters]patterns=["*.txt","*.md",]"""为了解析TOML,您需要安装第三方包。最流行的一个简称为toml。与YAML和JSON一样,它返回基本的Python数据类型。importtomldefconfiguration_from_toml(data):parsed=toml.loads(data)returnconfiguration_from_dict(parsed)总结选择配置格式是一个微妙的权衡。然而,一旦你决定,Python可以用少量代码解析大多数流行的格式。
