是否可以暂时禁用Python的字符串插值?

dan*_*ous 12 python string-interpolation

我使用python的日志记录模块设置了一个python记录器.我想使用ConfigParser模块将我正在使用的字符串与记录Formatter对象一起存储在配置文件中.

格式字符串存储在单独文件中的设置字典中,该文件处理配置文件的读取和写入.我遇到的问题是python仍然会尝试格式化文件,并在读取所有特定于日志模块的格式化标志时失败.

{
    "log_level":logging.debug,
    "log_name":"C:\\Temp\\logfile.log",
    "format_string":
        "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
}
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:如何在此处禁用格式化功能,同时将其保留在其他位置.我最初的反应是大量使用反斜杠来逃避各种百分比符号,但这当然会永久地打破格式化,即使我需要它也不会工作.

我还应该提一下,因为它在评论中被买了,所以ConfigParser做了一些导致跳闸的内部插值.这是我的追溯:

Traceback (most recent call last):
  File "initialconfig.py", line 52, in <module>
    "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
  File "initialconfig.py", line 31, in add_settings
    self.set(section_name, setting_name, default_value)
  File "C:\Python26\lib\ConfigParser.py", line 668, in set
    "position %d" % (value, m.start()))
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module
)s, line %(lineno)d - %(message)s' at position 10
Run Code Online (Sandbox Code Playgroud)

此外,关于良好的设置 - 文件实践的一般指针将是很好的.这是我第一次使用ConfigParser做任何重要事情(或者记录此事).

多谢,提前谢谢

wRA*_*RAR 12

你试图逃避百分比%%吗?

  • 事实证明这是Python 2.6.2中的一个错误.升级到2.6.5修复了问题.这完全符合要求. (3认同)

Hae*_*aes 10

你可能想用ConfigParser.RawConfigParser而不是ConfigParser.ConfigParser.只有后者才会对配置值进行神奇插值.

编辑:

实际上,使用ConfigParser.SafeConfigParser你可以使用额外的%百分号来转义格式字符串.这个例子应该正常工作:

{
    "log_level":logging.debug,
    "log_name":"C:\\Temp\\logfile.log",
    "format_string":
        "%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s"
}
Run Code Online (Sandbox Code Playgroud)


小智 8

您也可以将插值设置为None

config = ConfigParser(strict=False, interpolation=None)
Run Code Online (Sandbox Code Playgroud)

(我正在使用Python 3.6.0


Tam*_*más 5

还有RawConfigParser这就像ConfigParser没有插行为.如果你没有在配置文件中的任何其他部分使用插值功能,您只需更换ConfigParserRawConfigParser在你的代码.

有关更多详细信息,请参阅RawConfigParser的文档.