有没有办法暂时禁用Python的字符串插值?

15
我已经设置了一个 Python 日志记录器,使用 Python 的 logging 模块。我想将我正在使用的字符串与 logging Formatter 对象一起存储在配置文件中,并使用 ConfigParser 模块。格式化字符串存储在设置字典中,该字典位于另一个处理配置文件的文件中。我的问题是,Python 仍然尝试格式化文件,并在读取所有 logging 模块特定的格式化标志时失败。
{
    "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(或记录器)进行重要操作。

提前感谢,多米尼克


插值?我认为正确的词应该是格式化。 - Gustavo Muenz
@Edison:不,Python中也称为插值。http://docs.python.org/library/stdtypes.html#string-formatting-operations - Ignacio Vazquez-Abrams
我有些困惑——只有在通过% [或 string.substitute()] 显式地请求时,格式化才会发生。 - Andrew Jaffe
ConfigParser 进行了一些内部插值,导致了问题 - 我已经编辑了我的帖子以澄清。 - dangerouslyfacetious
6个回答

19

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


3
结果证明这是 Python 2.6.2 中的一个 bug。升级到 2.6.5 版本解决了此问题。这正好做到了所需的功能。 - dangerouslyfacetious

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"
}

那个可以。不过当我需要使用插值特性时会发生什么? - dangerouslyfacetious

17

您还可以将插值设置为None

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

(我正在使用Python 3.6.0


在Python 2.7上工作过。 - ChaitanyaBhatt

5

有一个名为RawConfigParser的工具,它类似于ConfigParser但没有插值行为。如果你在配置文件的其他部分中不使用插值功能,那么你可以在代码中简单地将ConfigParser替换为RawConfigParser

更多详细信息请参阅RawConfigParser的文档。


1

0
上面的代码有什么问题?只有在字符串应用%运算符时才会执行插值。如果您不使用%,则可以像其他字符串一样使用格式化字符串。

我应该提到 - ConfigParser模块在内部执行一些字符串插值,这就是它出错的地方。为了更清晰明了,我将编辑我的问题并附上回溯信息。 - dangerouslyfacetious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接