2010-03-29 166 views
7

我有一个Python记录器设置,使用Python的记录模块。我想使用ConfigParser模块将我正在使用的字符串与记录格式化对象一起存储在配置文件中。是否可以暂时禁用Python的字符串插值?

格式字符串存储在单独文件的设置字典中,该文件处理读取和写入配置文件。我遇到的问题是,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(或记录此事)完成任何重要的事情。

由于提前, 多米尼克

+0

插值?我认为正确的词将格式化 – 2010-03-29 12:55:55

+0

@Edison:不,在Python中它也被称为插值。 http://docs.python.org/library/stdtypes.html#string-formatting-operations – 2010-03-29 12:58:12

+0

我很困惑 - 格式化只发生在你明确要求它通过'%'[或'string.substitute( )']。 – 2010-03-29 13:00:26

回答

10

你尝试用%%逃跑百分比?

+3

事实证明这是Python 2.6.2中的一个错误。升级到2.6.5解决了这个问题。这正是需要的。 – dangerouslyfacetious 2010-03-31 10:50:08

1

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

+0

我应该提到 - ConfigParser模块在内部执行一些字符串插值,并且它是跳转的地方。为了清晰起见,我将使用追溯编辑我的问题。 – dangerouslyfacetious 2010-03-29 13:08:57

9

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

工作。虽然当我需要使用插值功能时会发生什么? – dangerouslyfacetious 2010-03-29 13:26:45

+0

看到我的更新部分的答案。 – Haes 2010-03-29 21:04:11

5

RawConfigParser这就好比ConfigParser没有插行为。如果您不在配置文件的任何其他部分使用插值功能,则可以在代码中简单地将ConfigParser替换为RawConfigParser

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

2

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

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

(我使用Python 3.6.0

相关问题