2010-03-29 97 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

相關問題