[gelöst] Zugriff auf config-Werte mittels Variable

  • Irgendwie stehe ich auf dem Schlauch und kann deinen genialen Gedanken nicht folgen :smiling_face:


    Bei meinem plumpen Beispiel mit der Inputbox und weiterverwenden des eingegebenen Textes (z.B. "av.policy_43") zum Abfragen eines fremden Config-Values (config.av.policy_43.value) gibt es doch gar keine Listen?!?


    Oder meinst du die settings-Datei in eine Liste einzulesen und darin dann zu suchen?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    Einmal editiert, zuletzt von Sven H ()

  • bitte lies was ich geschrieben habe, ich sagte doch das du dir mit append leicht eine liste bauen kannst und dann damit arbeiten. Und nein dafuer musst du nicht das file parsen.

    Einmal editiert, zuletzt von Lost in Translation ()

  • Tut mir Leid. Wir drehen uns im Kreis.
    Ich weiß nicht, was du mir damit sagen willst?


    Welche Liste soll ich mir bauen?


    Ich will doch nur einen Config-Value aus den Settings auslesen.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • wenn du jeweils ein paar bildest aus der config und deiner variable appendest du die zu deiner liste, dann greifst du zwar nicht direkt zu aber das leben ist deutlich einfacher.

  • Oder du serialisierst eine Liste der Werte und speicherst dann den serialisierten String in einem einzigen config Wert ab.
    Dann greifst du intern nicht mehr auf viele verschiedene config Werte zu, sondern liest die Werte aus der deserialisierten Liste aus.

  • Vielen Dank für eure Hinweise.
    Leider seid ihr mir da in den Kenntnissen weit überlegen.


    Ich habe beispielhaft folgende Liste, wo ich dann dazu den passenden config-Value auslesen möchte:

    Code
    conf = ["av.defaultac3", "av.policy_43"]


    bisher ermittle ich die dazu passenden config-values in einer Schleife so:

    Code
    conf_val = eval("config." + conf[x] + ".value")


    Gibt es dafür eine Lösung ohne eval?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Oder du serialisierst eine Liste der Werte und speicherst dann den serialisierten String in einem einzigen config Wert ab.
    Dann greifst du intern nicht mehr auf viele verschiedene config Werte zu, sondern liest die Werte aus der deserialisierten Liste aus.

    Sorry aber du scheinst gar nicht verstanden zu haben was er eigentlich tun will :winking_face:

  • Das scheint gut möglich zu sein, da mir die Lösungsvorschläge sehr abstrakt und nicht wirklich passend erscheinen.


    Liegt sehr wahrscheinlich daran, dass ich mein Problem nicht ausreichend dargestellt habe.


    Aber vielleicht hilft ja mein aktueller Code im Post #26 zur besseren Verdeutlichung meines Problems bzw. Vorhabens

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Willst Du einen "generischen"- Einstellungs- Editor bauen? Oder nur ein paar Zeilen Code sparen?


    "Schlechten" Code zu schrieben (und eval / exec ist in jeder mir bekannten Sprache schlechter Stil, u.a. weil gefährlich, sprich Code- Injection...), nur um sich 10 Zeilen "code- kopieren" zu sparen, ist schlechter Stil.


    "Schlechten" Code zu schreiben, weil man anders nicht ans Ziel kommt ist zumindest manchmal akzeptabel (allerdings nicht, ohne den Text, den man evaluiert vorher zu "sanitizen").


    Und Dein Beispiel lässt sich sicher besser umsetzen (gesamte config parsen, und die existierenden Werte auslesen, dann kann man dem Benutzer schon eine Liste mit existierenden Werten zur Auswahl geben und muss sich nicht auf -fehleranfällige- Eingaben über die Fernbedienung verlassen)...

  • Mein erster Gedanke war tatsächlich ein paar Zeilen Code zu sparen, da bei späterer Erweiterung der im Code fest verbauten Liste ja auch wieder der andere Code angepasst werden müsste.


    Das Problem könnte ja aber auch sein, dass ich vorher nicht wissen kann, welche Werte in conf[] enthalten sein könnten, da diese von extern (textfile oder so) nach Vorgabe des Users befüllt wird.


    Wenn ich selbst feste Werte habe könnte ich das ja wie oben geschrieben mit if und elif mit ein paar mehr Zeilen auseinandernehmen.


    Das Beispiel mit dem generischen Einstellungseditor-/Einstellungsabfrage trifft meine Frage zumindest ganz gut :smiling_face:


    Im Allgemeinen geht es mir dabei auch um die Darstellung möglicher Lösungen, falls man irgendwann mal auf ein solches Problem stößt. So eine Art Fortbildung. Ich beschäftige mich noch nicht sehr lange mit der Plugin-Programmierung.


    Manchmal gibt es ja doch einfache Lösungen, die man eben leider nicht kennt und dann unnütz zig Codezeilen schreibt :smiling_face:
    Wenn das dann ein Experte liest, kommt er dann mit Sicherheit ins Schmunzeln. Ich denke, ihr kennt das :face_with_tongue: (ihr habt bestimmt schon öfter über fremden Code geschmunzelt)


    So eine Absicherung kenne ich von mysql als real_escape_string. Gäbe es da auch was zur Verwendung bei exec und eval?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ok. Dann fehlt es mir mangels ausreichender Programmierkenntnisse an Vorstellungskraft eure (gutemine/MacDisein) Vorschläge in einer Lösung umzusetzen.


    Ich danke euch aber dennoch, dass ihr es zumindest vielfach versucht habt.
    Ich weiß euer Engagement und euren Rat zu schätzen.


    Auch an dieser Stelle vielen Dank für eure hilfreichen Plugins :smiling_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    • Offizieller Beitrag

    willst du sowas? (achtung das ist im browser getippt worden :P)



    Python
    values = [1, 2]
    configElements = [ config.sub.1, config.sub.2 ]
    for i in range(0,2):
        configElements[i].value = values[i]

    Alternativ kann man sich mit Hilfe eines dicts eine lut (Lookup-Table) aufbauen oder sich anderweitig eine helfer-Methode/Funktion schreiben um config Elemente und Werte zu "verbinden".
    Obiger Code würde noch ein bisschen Validierung vertragen ;). Womöglich sogar ein assert so dass man schon bei der Entwicklung auf unaufmerksamkeiten hingewiesen wird ;).
    Auf jeden Fall ist ein eval an der Stelle nicht sinnvoll (das ist nur selten überhaupt sinnvoll ;)).

  • Danke für die Antwort.
    Das könnte möglicherweise der richtige Weg sein. Mir fehlt da momentan die Vorstellungskraft, da es doch zu sehr von meinen Ausgangscode abweicht.


    Es wäre für mich wahrscheinlich einfacher zu verstehen, wenn sich der Vorschlag an meinem Beispiel aus Post #26 orientiert.


    Ich will ja keine Werte in eigene ConfigValues schreiben, sondern vorhandene fremde Config-Values auslesen.


    Auch wenn ihr eval zu Recht verteufelt, ist es zumindest für mich im Moment eine Lösung.


    Ich glaube, ich bringe euch sonst noch zu Verzweiflung:P


    Ich bräuchte dafür eine Lösung ohne eval:


    Code
    conf = ["av.defaultac3", "av.policy_43"]
    
    
    x=0
    for conf_txt in conf:
      conf_val[x] = eval("config." + conf_txt + ".value")
      x += 1

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Falls das conf[ ] wie schon geschrieben über eine externe Quelle (zB Textfile) variabel befüllt werden soll.


    Bei festen Vorgaben kann ich das ja alles selber im Code regeln.


    Ich suche eigentlich nur eine Lösung zum variablen Zugriff auf Configwerte ohne dabei eval zu nutzen.


    Ich kann mit eval leben.
    Aber wenn es eine sauberere Lösung gibt, wäre das natürlich toll. ☺️


    Eine Hilfsfunktion „toConfigElement('config.' + 'av.defaultac3')“ wäre vermutlich die Lösung
    Hab aber keine Ahnung ob sowas überhaupt geht. :face_with_tongue:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    5 Mal editiert, zuletzt von Sven H ()

  • Ich bin dank der Codevorschläge und Google dem Ziel etwas näher gekommen:

    Code
    tmp_conf = config
    tmp_conf.av = ConfigSubDict()
    tmp_conf.av["defaultac3"] = ConfigText()
    value = tmp_conf.av["defaultac3"].value

    Damit kann ich jetzt zwar die echten value-Werte aus den Settings mit String-Variablen abfragen, aber leider ändert sich dabei auch das echte config, so dass eine herkömmliche Abfrage von config.av.defaultac3.value zu einem Fehler (GS) führt.


    Könnte man für 'tmp_conf' so eine Art Kopie von 'config' erzeugen, wo dann Änderungen in der Kopie keine Auswirkung auf das Original hat?


    Mit dem Prinzip konnte ich jetzt zumindest die configwerte eines eigenen Plugins dynamisch erstellen und verwalten.
    Damit wäre mein ursprünglicher Gedanke zum variablen Code schon geklärt - und vor allem ohne eval :smiling_face:


    Nun wäre der Vollständigkeit halber nur noch interessant, ob der obere Code mit fremden Configwerten auch irgendwie klappt.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Nach langem Suchen habe ich nun eine Lösung gefunden :smiling_face:
    config.pickle() ist die entscheidende Funktion.


    Das 1. print liefert den Wert über das Original configElement config.av.defaultac3.value
    Das 2. print liefert eine Liste von passenden ConfigValues zur Text-Variablen "av.defaultac3"



    Code
    Telnet-Ausgabe:
    
    
    ==== config.av.defaultac3.value:  True
    ==== getConfigValue: 'av.defaultac3'  [['config.av.defaultac3', 'true']]

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • nur schade, dass ich das allein herausfinden musste.
    Gerade wenn man sich neu in ein Programmiersystem einarbeit, fehlt einem manchmal einfach nur ein konkreter Hinweis - da sieht man den Wald vor lauter Bäumen nicht.
    Ein Hinweis auf diese pickle()-Funktion hätte hier vermutlich allen nicht so viele Nerven gekostet. :smiling_face:


    Ich sehe es daher einfach als Erziehungsmaßnahme mich selber etwas mehr mit dem System zu beschäftigen und nicht einfach nur den Code vorgesetzt zu bekommen.
    Könnte mir gut vorstellen, dass das auch das Anliegen von @gutemine und @MacDisein war.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP