使用 python 模块进行配置有什么明显的缺点吗?
Are there any significant disadvantages of using python modules for configuration?
在我最近的几个程序中,我使用了 python 这种风格的配置文件
key="value"
contacts = [
{
"name": "Herbert",
"age": 10,
"height": "120cm"
},
{
"name": "Knight",
"age": 100,
"height": "200in"
}
]
这意味着我可以像这样访问配置:
import config
value = config.key
for person in config.contacts:
do_thing(person["name"], age=person["age"])
您还可以做一些花哨的事情,例如使用已安装的地址簿程序,或其他在运行时决定配置的事情。
from address_book_interface_module import people.dump_all
key = "value"
contacts = people.dump_all()
稍加努力,您还可以让人们编写函数
from address_book_interface_module import people.dump_all
def key():
if condition:
return "value"
else:
return "toast"
contacts = people.dump_all()
在我看来,这是无与伦比的配置和可能性,基本上允许您在配置文件中编写功能齐全的扩展。
然而,这些配置文件几乎从未被使用过。在另一个 SO 问题中,这被视为 "insecure",但 Django 和 "awesome window manager"(它使用 Lua)使用它没有任何问题。
这些配置文件的缺点是什么,这些缺点足够明显以至于没有人使用它们?
这种方法(在任何允许的语言中)是不安全的,因为编辑配置文件的用户可以添加任意命令,例如删除文件的命令。
很多年前,当我刚开始使用 Tcl 脚本语言时,Tcl 书籍提倡类似的方法(即应用程序应该在其配置文件中使用 Tcl 作为语法)。我讨厌这种方法,因为应用程序的用户可能不熟悉 Tcl 语法,如果用户在他们认为是配置文件的地方输入错误,那么他们会惊讶地看到堆栈跟踪而不是用户友好的错误消息.
另一个问题是某些配置文件解析器具有模式验证引擎,可以自动对配置文件的内容进行错误检查。例如,有numerous schema validation languages for XML, there is now a schema validation language for JSON, and Config4* (a configuration parser developed by me) also has its own schema validator。相比之下,您的示例 Python 程序忽略了在尝试使用该数据之前验证配置数据。因此,如果用户在基于 Python 的配置文件中输入语法正确但语义不正确的数据,那么结果很可能是程序在执行过程中的任意点崩溃,而不是信息性错误消息。
在我最近的几个程序中,我使用了 python 这种风格的配置文件
key="value"
contacts = [
{
"name": "Herbert",
"age": 10,
"height": "120cm"
},
{
"name": "Knight",
"age": 100,
"height": "200in"
}
]
这意味着我可以像这样访问配置:
import config
value = config.key
for person in config.contacts:
do_thing(person["name"], age=person["age"])
您还可以做一些花哨的事情,例如使用已安装的地址簿程序,或其他在运行时决定配置的事情。
from address_book_interface_module import people.dump_all
key = "value"
contacts = people.dump_all()
稍加努力,您还可以让人们编写函数
from address_book_interface_module import people.dump_all
def key():
if condition:
return "value"
else:
return "toast"
contacts = people.dump_all()
在我看来,这是无与伦比的配置和可能性,基本上允许您在配置文件中编写功能齐全的扩展。
然而,这些配置文件几乎从未被使用过。在另一个 SO 问题中,这被视为 "insecure",但 Django 和 "awesome window manager"(它使用 Lua)使用它没有任何问题。
这些配置文件的缺点是什么,这些缺点足够明显以至于没有人使用它们?
这种方法(在任何允许的语言中)是不安全的,因为编辑配置文件的用户可以添加任意命令,例如删除文件的命令。
很多年前,当我刚开始使用 Tcl 脚本语言时,Tcl 书籍提倡类似的方法(即应用程序应该在其配置文件中使用 Tcl 作为语法)。我讨厌这种方法,因为应用程序的用户可能不熟悉 Tcl 语法,如果用户在他们认为是配置文件的地方输入错误,那么他们会惊讶地看到堆栈跟踪而不是用户友好的错误消息.
另一个问题是某些配置文件解析器具有模式验证引擎,可以自动对配置文件的内容进行错误检查。例如,有numerous schema validation languages for XML, there is now a schema validation language for JSON, and Config4* (a configuration parser developed by me) also has its own schema validator。相比之下,您的示例 Python 程序忽略了在尝试使用该数据之前验证配置数据。因此,如果用户在基于 Python 的配置文件中输入语法正确但语义不正确的数据,那么结果很可能是程序在执行过程中的任意点崩溃,而不是信息性错误消息。