ConfigParser
要求所有部分,键和值都是字符串;没有惊喜。它具有使用getfloat
,getint
,getboolean
将值转换为数据类型的方法。如果您不知道数据类型,可以使用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
,但我真的希望保持配置文件的可读性。
你会怎么做?
答案 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顶部的包装器,因此它完全兼容。
上查看答案 2 :(得分:1)
如果您使用的是2.7+,则可以使用.getint
.getfloat
.getbool
方法。您可以在docs
因此,您的应用程序将使用print cp.getint('one', 'key')
答案 3 :(得分:1)
这是另一种解决方案。您可以生成一个 getany()
方法,该方法将自动检测并返回大多数类型的正确数据类型,包括 str
、int
、float
、bool
和 {{ 1}}。
请注意,配置文件中的符号必须是 Python 才能使其工作。例如None
表示布尔值 true 和 True
表示空值。
None
答案 4 :(得分:0)
Checkout ConfigIt以获取更多pythonic配置选项