smarthomeNG / smarthome

Device integration platform for your smart home
https://www.smarthomeNG.de
GNU General Public License v3.0
119 stars 92 forks source link

lib.item: add methods for list/dict manipulation #620

Closed Morg42 closed 4 months ago

Morg42 commented 5 months ago

Ich habe als Vorschlag und zur Diskussion mal meine Idee zum Handling von dicts und lists in Items ergänzt.

Martins Implementation ist unverändert, allerdings legt das Item je nach Typ die folgenden Item-Funktionen an:

list: append, prepend, insert, pop, extend, clear, delete, remove dict: get, delete, clear, pop, popitem, update

delete statt del, weil del als reserviertes Wort nicht nutzbar ist.

Die Funktionen lassen sich quasi 1:1 wie die originalen list-/dict-Funktionen nutzen, z.B.

listitem.append(val)
val = listitem.pop("2:3")

dictitem.update({'foo': 'bar'})
val = dictitem.get('baz', 'sorry')

Zusätzlich können allen Funktionen die Parameter caller, source, dest mitgegeben werden.

Intern rufen die Funktionen alle __call__ auf, so dass alle notwendigen Item-Mechaniken durchlaufen werden.

Ich sehe das Problem, dass für remove, pop usw. noch weitere zusätzliche Parameter an __call__ übergeben werden müssen und die Auswertung, welche Parameter und welche nicht übergeben wurden, schnell sehr unübersichtlich und komplex wird.

Das soll keine Kritik an Martins Implementation sein und kein Ersatz, sondern eine Ergänzung (append, prepend, get rufen sogar mit "seiner" neuen Syntax __call__ auf...).

Ob wir das annehmen wollen oder nicht, wäre ggf. zu diskutieren.

Die Methoden sind alle einzeln getestet. Automatische Tests kann ich leider nicht ohne Weiteres einbauen, weil die Initialisierung der Item-Klasse nicht "normal" durchlaufen wird.

Morg42 commented 4 months ago

So, aufgrund der Thematik sich überschneidender Methoden und Item-Namen gibt es jetzt ein "Unterobjekt" item.list bzw. item.dict. Das kann wie das Item aufgerufen werden item.list() === item().

Die oben beschriebenen Methoden (list.append, dict.update usw) sind jetzt "unterhalb" der Unterobjekte, also item.list.append(...) bzw item.dict.update(...). Damit kollidieren die Methoden nicht mehr - es sei denn, es existieren Unteritems mit den Namen "list" oder "dict".