【问题标题】:Is it possible to temporarily disable Python's string interpolation?是否可以暂时禁用 Python 的字符串插值?
【发布时间】:2010-03-29 12:49:28
【问题描述】:

我使用 python 的日志记录模块设置了一个 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"
}

我的问题很简单:如何在此处禁用格式化功能,同时将其保留在其他位置。我最初的反应是大量使用反斜杠来转义各种百分号,但这当然会永久破坏格式,即使我需要它也无法正常工作。

我还应该提到,由于它是在 cmets 中购买的,因此 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(或日志记录)做任何有意义的事情。

提前致谢, 多米尼克

【问题讨论】:

  • 插值?我认为正确的词是格式化
  • @Edison:不,在 Python 中它也称为插值。 docs.python.org/library/…
  • 我很困惑 - 只有当您通过 % [或 string.substitute()] 明确要求它这样做时才会发生格式化。
  • ConfigParser 进行了一些内部插值,导致跳闸 - 我已经编辑了我的帖子以澄清。

标签: python string-interpolation


【解决方案1】:

您是否尝试使用%% 来逃避百分比?

【讨论】:

  • 原来这是 Python 2.6.2 中的一个错误。升级到 2.6.5 解决了这个问题。这正是需要的。
【解决方案2】:

您可能想使用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"
}

【讨论】:

  • 那行得通。但是当我需要使用插值功能时会发生什么?
【解决方案3】:

您还可以使用设置为None 的插值。

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

(我正在使用 Python 3.6.0

【讨论】:

  • 也在 python 2.7 上工作过
【解决方案4】:

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

更多详情请参阅RawConfigParser 的文档。

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 我应该提到 - ConfigParser 模块在内部进行了一些字符串插值,这就是它出错的地方。为了清楚起见,我将使用回溯编辑我的问题。
    【解决方案6】:

    您使用的是哪个版本的 Python?升级到 2.6.4 可能会有所帮助,请参阅

    http://bugs.python.org/issue5741

    【讨论】:

      猜你喜欢
      • 2011-09-03
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2019-03-21
      相关资源
      最近更新 更多