2011-04-28 65 views
0

例如配置文件可以有不管位置如何,解析配置文件中的参数?

CFLAGS = "xyz" 
CXXFLAGS = "xyz" 

OR

CXXFLAGS = "xyz" 
CFLAGS = "xyz" 

我能想到的是只拆分的说法最佳实施和左侧送入开关

for line in file 
    x = line.split("=") 
    switch(x[0]) 
     case CFLAGS 
      do cflags 
     case CXXFLAGS 
      do cxxflags 

但如何做比我更有经验的人做它吗?我知道可能有些开源软件会这样做,但我甚至不知道在哪里寻找他们的源代码。 我主要在Python和C编程,所以实现/伪代码/ whattolookup都将是首选,虽然其他语言也很好。

在此先感谢。

P.S.尽量避免在答案中说出任何形式的re,regex,regexp,正则表达式或其任何派生词,除非它不可避免:P。

回答

0

由于Eli Bendersky说,在Python中,你应该只使用提供的ConfigParser

如果你坚持自己做,他将配置存储为字典的方法是我推荐的方法。另一种方法是将选项所对应的处理值,并做一些与他们的功能:

# Map the options to functions to handle them. 
handlers = { 
    'CFLAGS': some_function, 
    'CXXFLAGS': other_function, 
} 

# Loop through each option. 
for line in configuration: 
    # Get the option and value. 
    option, value = line.split('=') 
    option = option.strip().upper() 
    value = value.strip() 

    # Try to find a handler and process the option. 
    handler = handlers.get(option) 
    if handler: 
     handler(option, value) 
    else: 
     raise Exception('Unknown option.') 

显然,处理函数必须能够接受optionvalue参数你传递它。

+0

你虽然没有做任何有用的值。我将选项名称和值传递给处理程序(名称允许处理程序处理几个相关的键) – 2011-04-28 08:16:37

+0

@Eli:是的,这就是我想要做的。感谢您指出了这一点。 – Blair 2011-04-28 08:19:21

+0

我喜欢你的答案,所以我upvoted eli(因为他已经有一些自己的upvotes),并接受布莱尔的。谢谢 – Enders 2011-04-28 08:29:26

4

在Python中,只需使用ConfigParser模块,它将为您解析类似.ini的配置文件。

重新实现这一点,我发现查看配置数据作为一种字典很方便。这自然转化为Python的类型的字典,所以如果我分割线<key> = <value>我只是去和更新:

confdict[key] = value 

有了这个计划,在配置文件中键的顺序并不重要,就像它在字典本身并不重要 - 只要你可以查找键的值,你很高兴。


如果你看的ConfigParser引擎盖下,例如(相关的方法是_read),你会发现这正是它的作用。选项保存在字典中(每个部分一个,因为.ini配置文件具有一个层次结构)。使用正则表达式从文件中解析行,并按照上面所述将key, value对添加到字典中。


这是Python。在C中,我想有相当多的库可以做到这一点,但是实现你自己的将遵循完全相同的算法。你会为字典使用某种关联数组结构(散列表,树或任何其他东西,并不重要),并执行相同的分配分配&。