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

15 投票
6 回答
13729 浏览
提问于 2025-04-15 20:59

我在用Python的日志模块设置一个记录器。我想把我用的日志格式字符串存储在一个配置文件里,使用的是ConfigParser模块。

这个格式字符串被存储在一个设置字典中,放在一个单独的文件里,这个文件负责读取和写入配置文件。我的问题是,Python在读取这些特定于日志模块的格式标记时,还是会尝试格式化,结果就出错了。

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

我的问题很简单:我该如何在这里禁用格式化功能,同时又能在其他地方保留它。我的初步想法是大量使用反斜杠来转义各种百分号,但这样做会永久性地破坏格式化,导致即使在需要的时候也无法正常工作。

我还应该提到,因为在评论中提到过,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

另外,如果能给一些关于良好设置文件实践的建议就更好了。这是我第一次在ConfigParser(或者说日志方面)做一些重要的事情。

提前谢谢你, Dominic

相关问题:

6 个回答

18

你还可以把插值设置为 None

config = ConfigParser(strict=False, interpolation=None)

(我使用的是 Python 3.6.0

18

你可能想用 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"
}
19

你试过用 %% 来转义百分号吗?

撰写回答