Python - 配置选项,如何输入/处理?

3 投票
2 回答
1267 浏览
提问于 2025-04-15 12:22

当你的应用程序需要几个(大约5个)配置参数,并且这个应用会被非技术用户使用时(也就是要遵循KISS原则),你通常是怎么处理读取配置选项的,然后在不同的对象或函数之间传递这些参数(多个模块之间)呢?

举个例子,这些选项可能包括输入和输出的文件夹或文件名,还有详细程度的设置。

我一般会使用optparse(Python中的一个库),把这些选项或参数作为参数传递;不过我在想,是不是更常见的是使用一个配置文本文件,让所有模块的对象直接读取这个文件(但这样的话,不就相当于有了“全局”变量吗?而且没有人“拥有”这个状态?)。

另一个常见的问题是单元测试;如果我想独立测试每个模块,某个特定的模块可能只需要5个配置选项中的1个;你通常是怎么让每个模块或对象和应用的其他部分解耦,同时又能接受1到2个必需的参数的呢?(单元测试框架是否以某种方式调用或接管了配置功能?)

我猜这并没有一个唯一正确的方法,但了解各种不同的做法或知名的模式会很有意思。

2 个回答

2

你通常是通过以下方式读取配置选项的:

  • 命令行或图形界面选项
  • 配置文本文件

我们两者都用。我们使用Django的settings.py和logging.ini文件。对于那些经常变化的选项,我们还会使用命令行选项和参数。

那么多个模块或对象是如何访问这些选项的呢?

  • 对于settings.py和logging.ini,我也说不清楚。
  • 我们的选项是主程序私有的,用来构建函数或对象初始化时的参数。

[共享optparse选项非常麻烦,而且会把很多东西绑在一起,导致无法测试的混乱。]

在对单个模块进行单元测试时(不是“主”模块):

(例如,读取指定输入文件名的选项)

[我无法理解这个问题。我猜这是在问“当有选项时你怎么测试?”]

答案是——我们不测试。因为只有主方法会解析命令行选项,其他模块、函数或类根本不知道命令行选项是什么。没有哪个模块会“需要5个配置选项中的1个”。模块的类(或函数)只有普通的参数,仅此而已。

我们只使用optparse

0
"Counts answer"
Please update these counts and feel free to add/modify.

Do you usually read config options via:
- command-line/gui options : 1
- a config text file       : 0


How do multiple modules/objects have access to these options?
- they receive them from the caller as an argument: 1
- read them directly from the config text file:     0


When doing unit-testing of a single module (NOT the "main" module)
and the module uses one option, e.g. input filename:
- unit-test framework provides own "simplified" config functionality: 0
- unit-test framework invokes main app's config functionality:        1


Do you use:
- optparse:  1
- getopt:    0
- others?


Please list any config management "design pattern" 
(usable in Python) and add a count if you use it - thanks.
- 
-

当然可以!请把你需要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答