Ich habe nochmals über die Problematik des Zusammenfassens der Konfigurationen nachgedacht und herausgekommen ist folgendes Programm. Dieses sollte nun soweit funktionieren, wie in meiner ersten Antwort aufgezeichnet. Darüber hinaus verwendet die
get_configuration-Funktion nunmehr einen Dateiobjekt, so spielt es besser mit Sirius3s Beispiel zusammen:
Code: Alles auswählen
#!/usr/bin/env python3
import configparser
import itertools
def get_configuration(file_object): # -> dict
parser = configparser.ConfigParser()
parser.read_file(file_object)
return {section: dict(parser.items(section))
for section
in parser.sections()}
def merge_dicts(a, b): # -> dict
"""Merges two dicts prefering the values of the second one."""
return {k: v for k, v in itertools.chain(a.items(), b.items())}
def merge_configurations(a, b): # -> dict
# 1. Dafür Sorge trage, dass das Ergebnis die Sektionen beider
# Konfigurationen enthält. Hierzu bilde ich zunächst ein set
# (=Menge) über die Sektionsnamen beider Konfigurationen.
section_names = set(itertools.chain(a.keys(), b.keys()))
# 2. Dictionary erzeugen und die Inhalte der Sektionen
# zusammenfassen (merge_dicts). Hierbei werden die Inhalte des
# zweiten Konfiguration bevorzugt.
return {section_name: merge_dicts(a.get(section_name, {}),
b.get(section_name, {}))
for section_name
in section_names}
def main():
with open('default.ini') as default_config_file:
default_configuration = get_configuration(default_config_file)
with open('user.ini') as user_config_file:
user_configuration = get_configuration(user_config_file)
print(merge_configurations(default_configuration, user_configuration))
if __name__ == '__main__':
main()
Hier bietet sich ein Blick in die Dokumentation zu
itertools und zu
LC/
DC im Allgemeinen an.
PS: Ich nutze ausschließlich Python 3.5.,
configparser.ConfigParser.read_file im obigen Beispiel müsste ggf. durch readfp ersetzt werden.
readfp ist ab Python 3.2 veraltet.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"