将ConfigParser值转换为python数据类型

tMC*_*tMC 11 python eval configparser

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
>>> 
Run Code Online (Sandbox Code Playgroud)

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

我以为我会用pickle它,但我真的想保持配置文件是人类可读的.

你会怎么做?

And*_*ark 14

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

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

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

这将像eval字符串是安全的一样工作:

>>> literal_eval("{'key': 10}")
{'key': 10}
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)


Eri*_*ken 5

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

请注意,配置文件中的表示法必须是 Python 才能正常工作。例如,True对于布尔值 true 和Nonenull 值。

from ast import literal_eval
import configparser

parser = configparser.ConfigParser(converters={"any": lambda x: literal_eval(x)})
value = parser.getany("section", "key")
# ...
Run Code Online (Sandbox Code Playgroud)