ConfigParser
和SafeConfigParser
之间有什么区别?那么,为什么后者更安全呢? ConfigParser
有什么“不安全”?我知道SafeConfigParser
继承了ConfigParser
,它有什么不同?
答案 0 :(得分:8)
SafeConfigParser实现了一种不同的set(section, option, value)
方法,如果该节不存在,它将引发NoSectionError;如果TypeError
不存在,则引发value
。字符串。
这允许对解析器行为的更多控制,文档中的example:
try:
config.set(section2, option, config.get(section1, option, 1))
except ConfigParser.NoSectionError:
# Create non-existent section
config.add_section(section2)
opt_move(config, section1, section2, option)
else:
config.remove_option(section1, option)
来自documentation :它还支持插值。这意味着值可以包含引用同一节中其他值或特殊DEFAULT节中的值的格式字符串。可以在初始化时提供其他默认值。
更新
我刚刚检查了SafeConfigParser
中的source code,即使确实ConfigParser
也允许插值,SafeConfigParser
仍提供了{{ 3}}将其描述为更神奇,更可预测的魔术插值功能。
例如,如果引用错误或'%'字符后出现语法错误,它将引发InterpolationSyntaxError
。
更新2
这对于精确描述SafeConfigParser
类documentation可能很有用。如果您不确定应该在python 2.7中使用SafeConfigParser
还是ConfigParser
中的哪个,请使用第一个(除非您有非常特定的理由使用第二个)
您还可以通过执行以下操作,简化将来向python 3+(has been renamed to ConfigParser in Python 3.2)的过渡:
from ConfigParser import SafeConfigParser as ConfigParser
答案 1 :(得分:1)
SafeConfigParser
是...
ConfigParser的派生类,该类实现了 魔术插值功能的更健全的变体。这个 实施也更可预测。新的应用程序应该 如果他们不需要与较早版本兼容,则更喜欢此版本 版本的Python。
我认为SafeConfigParser
似乎没有考虑Python版本的兼容性。 ConfigParser
在Python 3版本中也存在,但是SafeConfigParser
不存在。确实,SafeConfigParser
被重命名为ConfigParser
,ConfigParser
在3.2
中被删除了。参见此question。
因此,我认为ConfigParser
和SafeConfigParser
之间的区别在于可用性和版本兼容性。
更新:
SafeConfigParser
比ConfigParser
安全。这并不是说ConfigParser
是不安全的。我试图找出更安全的方法。它支持magical interpolation的更合理的变体,并且比ConfigParser
更严格。
那为什么SafeConfigParser是安全的?
答案是SafeConfigParser
更严格。严格的示例在@ olinox14答案中。
SafeConfigParser
已成为Python 3中的默认ConfigParser
这一事实并不一定意味着您需要将它们分开。
最终, SafeConfigParser
更加严格。并且建议使用SafeConfigParser。
答案 2 :(得分:0)
根据https://docs.python.org/2/library/configparser.html:
除了核心功能之外,SafeConfigParser还支持插值。这意味着值可以包含引用同一节中其他值的格式字符串,或特殊DEFAULT节中的值。初始化时可以提供其他默认值。