对于我的最后几个程序,我使用了这种风格的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问题中,这被视为“不安全”,但Django和“令人敬畏的窗口管理器”(它使用Lua)使用它没有任何问题。
这些配置文件有哪些缺点,足以让人们使用它们?
答案 0 :(得分:1)
这种方法(在任何允许它的语言中)都是不安全的,因为编辑配置文件的用户可以添加任意命令,例如删除文件的命令。
许多年前,当我第一次开始使用Tcl脚本语言时,Tcl书籍提出了类似的方法(即,应用程序应该使用Tcl作为其配置文件中的语法)。我讨厌这种方法,因为应用程序的用户可能不熟悉Tcl语法,如果用户在他们认为的配置文件中输入错字,那么他们会惊讶地看到堆栈跟踪而不是用户友好的错误信息。
另一个问题是某些配置文件解析器具有架构验证引擎,可以自动对配置文件内容进行错误检查。例如,有numerous schema validation languages for XML,现在有schema validation language for JSON,Config4*(由我开发的配置解析器)也有自己的schema validator。相反,您的示例Python程序在尝试使用该数据之前忽略了验证配置数据。因此,如果用户在基于Python的配置文件中输入语法正确但语义不正确的数据,那么结果很可能是程序执行中任意点的程序崩溃,而不是信息性错误消息。