将ConfigParser值转换为python数据类型

时间:2011-06-02 00:04:42

标签: python eval configparser

ConfigParser要求所有部分,键和值都是字符串;没有惊喜。它具有使用getfloatgetintgetboolean将值转换为数据类型的方法。如果您不知道数据类型,可以使用get()包装eval()以获得评估的字符串,例如:

>>> from ConfigParser import SafeConfigParser
>>> cp = SafeConfigParser()
>>> cp.add_section('one')
>>> cp.set('one', 'key', '42')
>>> print cp.get('one', 'key')
'42'
>>> print eval(cp.get('one', 'key'))
42
>>> cp.set('one', 'key', 'None')
>>> print eval(cp.get('one', 'key'))
None
>>> 

有更好的方法吗?我认为在评估文件中的文本方面存在一些严重的安全问题 - 我承认这一点;我完全信任该文件。

我认为我会使用pickle,但我真的希望保持配置文件的可读性。

你会怎么做?

5 个答案:

答案 0 :(得分:13)

如果您使用的是Python 2.6或更高版本,则可以使用ast.literal_eval

  

<强> ast.literal_eval(node_or_string)
  安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None。

     

这可用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自己解析值。

当字符串安全时,这将像eval一样工作:

>>> literal_eval("{'key': 10}")
{'key': 10}

但如果出现文档中列出的类型以外的任何内容,它将会失败:

>>> literal_eval("import os; os.system('rm -rf somepath')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib64/python2.6/ast.py", line 37, in parse
    return compile(expr, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    import os; os.system('rm -rf somepath')
         ^
SyntaxError: invalid syntax

答案 1 :(得分:3)

对于那些可能正在寻找另一个更简单的答案的人,您可以使用为您进行转换的localconfig模块,而不必自己转换数据类型。转换是通过根据值猜测数据类型来完成的(即,123是一个int,123.4是一个浮点数,true是一个bool,依此类推)。

以下是OP的一个例子:

>>> from localconfig import config
>>> config.read('[one]\nkey = 42\nkey2 = None')
>>> config.one.key, type(config.one.key)
(42, <type 'int'>)
>>> config.one.key2, type(config.one.key2)
(None, <type 'NoneType'>)
>>> config.get('one', 'key'), config.get('one', 'key2')
(42, None)

它是ConfigParser顶部的包装器,因此它完全兼容。

https://pypi.python.org/pypi/localconfig

上查看

答案 2 :(得分:1)

如果您使用的是2.7+,则可以使用.getint .getfloat .getbool方法。您可以在docs

中详细了解相关信息

因此,您的应用程序将使用print cp.getint('one', 'key')

答案 3 :(得分:1)

这是另一种解决方案。您可以生成一个 getany() 方法,该方法将自动检测并返回大多数类型的正确数据类型,包括 strintfloatbool 和 {{ 1}}。

请注意,配置文件中的符号必须是 Python 才能使其工作。例如None 表示布尔值 true 和 True 表示空值。

None

答案 4 :(得分:0)

Checkout ConfigIt以获取更多pythonic配置选项

https://github.com/barberj/ConfigIt