
Hallo,
print("Result: %s" % params.get_result())
erzeugt
Result: {'abc': 21.1, 'def': 21.400000000000002}
Ich (perl) würde das als Hash bezeichnen. Wie kann ich die einzelnen Werte durchiterieren und z.B. so ausgeben? (das soll später nach mqtt published und in mysql geschrieben werden)
for i in params.get_result().keys: print("key: %s, value %s" %(i, params.get_result()[i]))
params ist eine Instanz einer Klasse.
params = ParameterParser(parameter_definition)
Dort gibts
def get_result(self): return self.result
gefüllt wird result so
if self.is_integer_num (value): self.result[title] = int(value) else: self.result[title] = value
Danke, Jan

On 2023-01-14 19:58, Jan Schmidt wrote:
print("Result: %s" % params.get_result())
erzeugt
Result: {'abc': 21.1, 'def': 21.400000000000002}
Ich (perl) würde das als Hash bezeichnen.
Ja, ich denke auch, dass das einem Perl-Hash entspricht. :-)
Wie kann ich die einzelnen Werte durchiterieren und z.B. so ausgeben? (das soll später nach mqtt published und in mysql geschrieben werden)
Iteration über die Keys: Methode `keys`, oder - idiomatischer - direkt über das Dictionary iterieren, also
for key in my_dictionary: ...
Iteration über die Values zu den Keys: Methode `values`
Iteration über Key/Value-Tuple: `items`
Das sind aber so grundlegende Sachen, dass ich dir empfehle, erst mal das Tutorial auf der Python-Website durchzuarbeiten:
https://docs.python.org/3/tutorial/index.html
Zu meiner Überraschung sind dort in
https://docs.python.org/3/tutorial/datastructures.html#dictionaries
`keys` und `values` nicht erwähnt, aber immerhin `items`.
Daher mal eine Frage in die Runde: Kennt ihr ausführlichere Python-Einführungen, die man Python-EinsteigerInnen in solchen Situationen empfehlen kann? :-)
Zum Begriff "Instanz" bzw. der Mail von Stefan Ram: Ja, eigentlich ist "Instanz" ein Anglizismus und "Exemplar" wäre als deutsche Übersetzung des englischen "instance" "korrekter". Andererseits ist nach meinem Eindruck die Verwendung von "Instanz" schon lange weit verbreitet und wird als Fachbegriff wahrscheinlich noch eher richtig eingeordnet als "Exemplar." Ich kann aber sonst noch "Objekt" als Alternative vorschlagen. :-)
Viele Grüße Stefan

Servus Jan!
Ich gehe anders als die anderen Mal auf Dein eigentliches Ziel ein.
Am 14.01.23 um 19:58 schrieb Jan Schmidt:
Werte durchiterieren und z.B. so ausgeben? (das soll später nach mqtt published und in mysql geschrieben werden)
Du willst mit Python Daten per MQTT versenden.
Leider ist MQTT nur ein Transport-Protokoll, welches aber über die Daten welche transportiert werden keine Vorgaben trifft. Daran krankt das ganze Home-Automatisation Zeug und ist auf einem Niveau von 1990. BÄHH!
Dazu eine Erläuterung im Beispiel.
Du hast aus einem Sensor die Temperatur des Raumes "Keller" gemessen, diese sei in einer Python Variable "t" gespeichert, deren Wert 18.2 c° sei.
t = 18.2
Nu erzeugen wir darus einen Menschenlesbaren Datensatz in Form einen Python Dicts.
ds = {'keller': t} ds
{'keller': 18.2}
Was nun fehlt ist die Einheit 'Grad C'.
ds = {'keller': { 'value' :t, 'unit':'Grad C'}}
{'keller': {'value': 18.2, 'unit': 'Grad C'}}
Schon besser. Noch besser ist es, wenn wir dem Keller auch sagen, was für eine Eigenschaft wir gemessen haben.
ds = {'keller': {'temperatur' : { 'value' :t, 'unit':'Grad C'}, 'feuchte': {'value':85, 'unit':'Prozent'}}}
ds['keller']['temperatur']['value']
18.2
Wenn Dir das mit den ganzen Klammern zu lästig wird gibt es dafür Python-Module (z.B.addict https://pypi.org/project/addict/), die das ganauso wie in Perl/Javascript abkürzen können.
Aber nun haben wir einen schönen Datensatz für den Keller.
from pprint import pprint pprint(ds)
{'keller': {'feuchte': {'unit': 'Prozent', 'value': 85}, 'temperatur': {'unit': 'Grad C', 'value': 18.2}}}
Nun willst Du das per mqtt senden. Mqtt kann nur "texte" übermittelt. Daher musst Du nun Deine schöne Python-Struktur in einen Text umwandeln.
from pprint import pformat daten_als_text = pformat(ds) daten_als_text
"{'keller': {'feuchte': {'unit': 'Prozent', 'value': 85},\n 'temperatur': {'unit': 'Grad C', 'value': 18.2}}}"
Diese Daten lassen sich nun einfach per mqqt senden. Deine Python Daten-Struktur ist in einen Test serialisiert worden.
Aber das ist nur der Anfang des Problems. Denn wie soll die Gegenstelle nun diesen Text de-serialisieren, also die ursprüngliche Datenstruktur so wieder herstellen, dass sie im Code verwendet werden kann.
Das Ganze wird noch komplizierter, wenn die Gegenstelle in einer anderen Programmiersprache arbeitet.
Damit Daten also sinnvoll zwischen Systemen ausgetauscht werden können braucht es Serialisierungs-Standards [1].
Nehmen wir einmal an Du serialisierts Deine Daten als JSON.
import json json.dumps(ds)
'{"keller": {"temperatur": {"value": 18.2, "unit": "Grad C"}, "feuchte": {"value": 85, "unit": "Prozent"}}}'
Nun schickst Du diesen JSON-String per mqtt zu einer Javascript-Software, die JSON erwartet.
Diese Javascript-Software erzeugt aus den erwarteten JSON-Daten eine Variable "data".
[Um dieses Beispiel auszuführen nimm einen Firefox. Mache SHIFT-CTRL-i, klicke im neuen Menu auf "Console" und trage unten wo die ">>" sind den Code ein ]
data= JSON.parse('{"keller": {"temperatur": {"value": 18.2, "unit": "Grad
C"}, "feuchte": {"value": 85, "unit": "Prozent"}}}')>> data.keller.feuchte
Object{ value: 85, unit: "Prozent"}
Das ist schon mal ziemlich geil, Du hast strukturierte Python-Daten umgewandlet in strukturiete JavaScript-Daten.
Das Javascript-Programm kann nun mit diesem Datensatz arbeiten.
Nun kommt das lang erwartete "ABER". ***Aber, auf beiden Seiten muss klar sein, welches Struktur-Element was bedeutet.*
Denn genausogut könnte man die Daten so ablegen:
ds = {'temperatur': {'keller' : { 'value' :t, 'unit':'Grad C'}, 'speicher' : {}} 'feuchte': {'keller' : {'value':85, 'unit':'Prozent'}}}
Du betrittst hier ein weites Feld mit vielen Dornenranken.
Aber wir helfen natürlich gerne.
[1]https://journal.ub.tu-berlin.de/eceasst/article/download/1134/1078
Beste Grüße
Volker

Jan Schmidt jan.schmidt@gmx.de writes:
for i in params.get_result().keys: print("key: %s, value %s" %(i, params.get_result()[i]))
Das sieht korrekt aus; allerdings recht unübersichtlich. Ich würde über "items" iterieren:
for key, value in params.get_result().items(): print("key: %s, value %s" % (key, value))
Dann würde ich auch die neueren (ab Python 3.6) f-strings nutzen:
for key, value in params.get_result().items(): print(f"key: {key}, value {value}")
def get_result(self): return self.result
Diese Definition würde ich komplett weglassen und stattdessen direkt params.result verwenden:
for key, value in params.result.items(): print(f"key: {key}, value {value}")
Best
Ole

Danke an alle auch für die Literatur.
Mein Problem konnte ich erfolgreich lösen.
Jan
participants (4)
-
Dr. Volker Jaenisch
-
Jan Schmidt
-
Stefan Schwarzer
-
Оlе Ѕtrеісhеr