2017-03-22 5 views
0

Ich schreibe ein Programm in Python 3, um mit mehreren Geräten zu arbeiten. Und ich muss für jedes Gerät Konstanten speichern. Einige Konstanten sind für alle Geräte allgemein gültig und dauerhaft festgelegt, einige andere unterscheiden sich je nach Firmware-Version der Geräte jedoch von Version zu Version. Ich muss Konstanten für alle Versionen speichern, nicht nur für die letzte. Sag mir bitte die Pythonic-Methode, um Konstanten für verschiedene Geräte und mehrere Versionen davon zu definieren.Python mehrere Versionen von Konstanten

sieht Meine aktuelle Lösung wie folgt aus:

general = { 
    'GENERAL_CONST_1': 1, 
    'GENERAL_CONST_2': 2, 
    ... 
    'GENERAL_CONST_N': N 
} 


device_1 = dict() 
device_1[FIRMWARE_VERSION_1] = { 
    'DEVICE_1_CONST_1': 1, 
    'DEVICE_1_CONST_2': 2, 
    ... 
    'DEVICE_1_CONST_N': N 
} 
device_1[FIRMWARE_VERSION_1].update(general) 

device_1[FIRMWARE_VERSION_2] = { 
    'DEVICE_1_CONST_1': 1, 
    'DEVICE_1_CONST_2': 2, 
    ... 
    'DEVICE_1_CONST_N': N 
} 
device_1[FIRMWARE_VERSION_2].update(general) 


device_2 = dict() 
device_2[FIRMWARE_VERSION_1] = { 
    'DEVICE_2_CONST_1': 1, 
    'DEVICE_2_CONST_2': 2, 
    ... 
    'DEVICE_2_CONST_N': N 
} 
device_2[FIRMWARE_VERSION_1].update(general) 

device_2[FIRMWARE_VERSION_2] = { 
    'DEVICE_2_CONST_1': 1, 
    'DEVICE_2_CONST_2': 2, 
    ... 
    'DEVICE_2_CONST_N': N 
} 
device_2[FIRMWARE_VERSION_2].update(general) 

Vielen Dank im Voraus! Oder, wenn Sie mir in die Richtung zeigen könnten, wo ich über das Obige lesen kann, werde ich auch dafür dankbar sein.

UPD1:

Dank ich @languitar entschied einer der INI/JSON/YAML/TSON ... Format zu verwenden. Zum Beispiel Formate, die in der Bibliothek python-anyconfig unterstützt werden. Format INI (vorgeschlagen von @languitar configparser) sieht gut für meine Zwecke aus (auch TSON schien interessant), aber leider unterstützen beide keinen Hexadezimalwert. Ich war sehr überrascht. Aber alle meine Konstanten sollten Hex-Format haben. Und dann entschied ich mich für das YAML-Format. Jetzt mit Konstanten-Datei wie folgt aussehen:

# General consts for all devices and all versions 
general: &general 
    GENERAL_CONST_1: 1 
    GENERAL_CONST_2: 2 
    ... 
    GENERAL_CONST_N: N 

# Particular consts for device_1 for different firmware version 
device_1: &device_1 
    <<: *general 
    # General consts for device_1 and all firmware versions 
    DEVICE_1_CONST_1: 1 
device_1: 
    FIRMWARE_VERSION_1: 
     <<: *device_1 
     DEVICE_1_CONST_2: 2 
     ... 
     DEVICE_1_CONST_N: N 
    FIRMWARE_VERSION_2: 
     <<: *device_1 
     DEVICE_1_CONST_2: 2 
     ... 
     DEVICE_1_CONST_N: N 

# Particular consts for device_2 for different firmware version 
device_2: &device_2 
    <<: *general 
    # General consts for device_2 and all firmware versions 
    DEVICE_1_CONST_1: 1 
device_2: 
    FIRMWARE_VERSION_1: 
     <<: *device_2 
     DEVICE_1_CONST_2: 2 
     ... 
     DEVICE_1_CONST_N: N 
    FIRMWARE_VERSION_2: 
     <<: *device_2 
     DEVICE_1_CONST_2: 2 
     ... 
     DEVICE_1_CONST_N: N 

Aber ich bin mir nicht sicher, ob dies der richtige Weg ist Konstanten für Geräte zu speichern und alle Firmware-Versionen

+0

Vielleicht sind Ihre Konstanten überhaupt nicht konstant und was Sie wirklich brauchen, ist eine gerätespezifische Konfiguration, z Verwenden des Moduls ['configparser'] (https://docs.python.org/3/library/configparser.html). – languitar

+0

@languitar, vielen dank für ihre antwort! Es scheint eine interessante Lösung für mich zu sein. Ich werde versuchen, es jetzt umzusetzen. –

+0

@languitar, ich habe nicht erwähnt, aber ich sollte Konstanten im hexadezimalen Format speichern. Leider unterstützt [configparser] (https://docs.python.org/3/library/configparser.html) es nicht, wie ich es verstehe. Aber ich habe es ähnlich versucht (YAML-Format) und dementsprechend meine Frage aktualisiert. –

Antwort

0

einfach Ihre Namen zu Großbuchstaben ändern

wie GENERAL, DEVICE_1, etc

+0

Danke, aber es ist nicht das, was ich brauche. Wenn ich mehrere häufige Störungen speichern musste, habe ich diesen Weg gewählt, aber die Schwierigkeit liegt in unterschiedlichen Gewittern für verschiedene Geräte und unterschiedliche Firmware. –