15 Stimmen

Ist es möglich, die String-Interpolation von Python vorübergehend zu deaktivieren?

Ich habe einen Python-Logger eingerichtet, der das Logging-Modul von Python verwendet. Ich möchte die Zeichenfolge, die ich mit dem Logging-Formatter-Objekt in einer Konfigurationsdatei mit dem Modul ConfigParser speichern.

Der Formatstring wird in einem Einstellungswörterbuch in einer separaten Datei gespeichert, die das Lesen und Schreiben der Konfigurationsdatei übernimmt. Das Problem, das ich habe, ist, dass Python immer noch versucht, die Datei zu formatieren, und umkippt, wenn es alle Logging-Modul-spezifischen Formatierungsflags liest.

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

Meine Frage ist einfach: Wie kann ich die Formatierungsfunktion hier deaktivieren, während sie an anderer Stelle erhalten bleibt. Meine erste Reaktion war reichlich Gebrauch von der Backslash, um die verschiedenen Prozentzeichen zu entkommen, aber das natürlich dauerhaft bricht die Formatierung, so dass es nicht funktioniert, auch wenn ich es brauchen.

Ich sollte auch erwähnen, da es in den Kommentaren gekauft wurde, dass ConfigParser einige interne Interpolation tut, die die Stolperstelle verursacht. Hier ist mein Traceback:

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

Auch allgemeine Hinweise auf gute Praktiken für Einstellungsdateien wären nett. Dies ist das erste Mal, dass ich etwas Bedeutendes mit ConfigParser (oder Protokollierung für diese Angelegenheit) getan habe.

Vielen Dank im Voraus, Dominic

19voto

wRAR Punkte 24128

Haben Sie versucht, den Prozentsätzen mit %% ?

18voto

Haes Punkte 12351

Verwenden Sie am besten ConfigParser.RawConfigParser anstelle von ConfigParser.ConfigParser . Nur letztere führt eine magische Interpolation der Konfigurationswerte durch.

EDIT:

In der Tat, mit ConfigParser.SafeConfigParser können Sie Formatzeichenfolgen mit einem zusätzlichen % Prozentzeichen. Dieses Beispiel sollte dann funktionieren:

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

17voto

Bharati Desai Punkte 141

Sie können auch die Interpolation verwenden, die auf None .

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

(Ich verwende Python 3.6.0 )

5voto

Tamás Punkte 45697

Es gibt RawConfigParser das ist wie ConfigParser ohne das Interpolationsverhalten. Wenn Sie die Interpolationsfunktion in keinem anderen Teil der Konfigurationsdatei verwenden, können Sie einfach Folgendes ersetzen ConfigParser con RawConfigParser in Ihrem Code.

Siehe die Dokumentation von RawConfigParser für weitere Einzelheiten.

1voto

Peter Otten Punkte 11

Welche Version von Python verwenden Sie? Ein Upgrade auf 2.6.4 könnte helfen, siehe

http://bugs.python.org/issue5741

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X