Hierarchische Datenstrukturen in Python

27/11/2008 - 01:22 von Andreas Bruhn | Report spam
Hi allerseits,

ich mache mir gerade eine Schnittstelle um mir hierarchische Daten aus
einer ebensolchen Datenbank auszulesen. Nun frage ich mich wie bilde
ich das am besten in Python ab.

Ein kleines Datenbeispiel aus einem Buch zur DB schlecht(?) nach
Python übersetzt:

Waren[(12300,)]=["Sweatshirt","EASY GmbH"] # Artikelnummer: Name,
Hersteller

Waren[(12300,44)].95 # Größe: Preis
Waren[(12300,46)] .95 # Größe: Preis
Waren[(12300,48)]".95 # Größe: Preis
Waren[(12300,50)]$.95 # Größe: Preis

Waren[(12300,50,'classic-beige')]=4 # Farbe: Lagerbestand
Waren[(12300,50,'karibikblau')] # Farbe: Lagerbestand
Waren[(12300,50,'kiwigrün')]=8 # Farbe: Lagerbestand
Waren[(12300,50,'maisgelb')]=8 # Farbe: Lagerbestand

Waren[(23400,)]=["Hose","Gentle und Co."] # Artikelnummer: Name,
Hersteller
Waren[(34500,)]=["Sakko","Gentle und Co."] # Artikelnummer: Name,
Hersteller


Das entspricht also im Prinzip einem Dictionary bei dem es zu jedem
Key einen Datenelement geben kann und auch ein weiteres Dictionary für
die nàchste Hierarchieebene. Von daher könnte ich es vielleicht auch
so aufbauen:

Waren[12300]=(["Sweatshirt","EASY GmbH"], {44: (18.95, {}), 46:
(20.95, {}), 48: (22.95, {}), 50 : (24.95, { 'classic-beige': (4, {}),
'karibikblau': (15, {}), 'kiwigrün': (8, {}), 'maisgelb': (8, {})} ) }
)

Waren[23400]=(["Hose","Gentle und Co."], {} )
Waren[34500]=(["Sakko","Gentle und Co."], {} )

Jetzt ist jeder Wert zu einem Key ein Tupel aus zwei Elementen: das
erste Element ist das Datenelement, das zweite ein (gegebenenfalls
leeres) Dictionary.

Erscheint mir wie die erste Variante weder schön noch elegant. :-(

Mit den Datenstrukturen von Python die mir jetzt so einfallen sehe ich
da irgendwie kein Land. Bleibt also nur eine eigene Klasse zu bauen.

Eigentlich kein Problem, aber ich habe mittlerweile zu viel in dieser
Datenbank programmiert und kann zur Zeit nicht mehr richtig in
"Python" denken. :-( Hat jemand mal einen Denkanstoß in eine schöne,
möglichst elegante und gleichzeitig einfache, Lösungsrichtung...

* Von Dict ableiten und value-Attribut hinzufügen?
* Nicht von Dict ableiten, dafür __setitem__, __getitem__,
__delitem__, __len__ und __contains__ implementieren?
* Die Klasse DictMixin aus dem UserDict-Modul als zusàtzliche
Oberklasse meiner eigeen Klasse nutzen?

Grüße,
Andreas
 

Lesen sie die antworten

#1 Diez B. Roggisch
27/11/2008 - 11:29 | Warnen spam
Andreas Bruhn wrote:

Hi allerseits,

ich mache mir gerade eine Schnittstelle um mir hierarchische Daten aus
einer ebensolchen Datenbank auszulesen. Nun frage ich mich wie bilde
ich das am besten in Python ab.

Ein kleines Datenbeispiel aus einem Buch zur DB schlecht(?) nach
Python übersetzt:

Waren[(12300,)]=["Sweatshirt","EASY GmbH"] # Artikelnummer: Name,
Hersteller

Waren[(12300,44)].95 # Größe: Preis
Waren[(12300,46)] .95 # Größe: Preis
Waren[(12300,48)]".95 # Größe: Preis
Waren[(12300,50)]$.95 # Größe: Preis

Waren[(12300,50,'classic-beige')]=4 # Farbe: Lagerbestand
Waren[(12300,50,'karibikblau')] # Farbe: Lagerbestand
Waren[(12300,50,'kiwigrün')]=8 # Farbe: Lagerbestand
Waren[(12300,50,'maisgelb')]=8 # Farbe: Lagerbestand

Waren[(23400,)]=["Hose","Gentle und Co."] # Artikelnummer: Name,
Hersteller
Waren[(34500,)]=["Sakko","Gentle und Co."] # Artikelnummer: Name,
Hersteller


Das entspricht also im Prinzip einem Dictionary bei dem es zu jedem
Key einen Datenelement geben kann und auch ein weiteres Dictionary für
die nàchste Hierarchieebene. Von daher könnte ich es vielleicht auch
so aufbauen:

Waren[12300]=(["Sweatshirt","EASY GmbH"], {44: (18.95, {}), 46:
(20.95, {}), 48: (22.95, {}), 50 : (24.95, { 'classic-beige': (4, {}),
'karibikblau': (15, {}), 'kiwigrün': (8, {}), 'maisgelb': (8, {})} ) }
)

Waren[23400]=(["Hose","Gentle und Co."], {} )
Waren[34500]=(["Sakko","Gentle und Co."], {} )

Jetzt ist jeder Wert zu einem Key ein Tupel aus zwei Elementen: das
erste Element ist das Datenelement, das zweite ein (gegebenenfalls
leeres) Dictionary.

Erscheint mir wie die erste Variante weder schön noch elegant. :-(

Mit den Datenstrukturen von Python die mir jetzt so einfallen sehe ich
da irgendwie kein Land. Bleibt also nur eine eigene Klasse zu bauen.

Eigentlich kein Problem, aber ich habe mittlerweile zu viel in dieser
Datenbank programmiert und kann zur Zeit nicht mehr richtig in
"Python" denken. :-( Hat jemand mal einen Denkanstoß in eine schöne,
möglichst elegante und gleichzeitig einfache, Lösungsrichtung...

* Von Dict ableiten und value-Attribut hinzufügen?
* Nicht von Dict ableiten, dafür __setitem__, __getitem__,
__delitem__, __len__ und __contains__ implementieren?
* Die Klasse DictMixin aus dem UserDict-Modul als zusàtzliche
Oberklasse meiner eigeen Klasse nutzen?



Keins von alldem. Einfach eine Klasse "Ware" mit entsprechenden
Eigenschaften - Hersteller, Warengruppe, usw. Dann eine andere Klasse,
sowas wie "Variation", mit Eigenschaften Preis (decimal datentyp nicht
vergessen!), Farbe & Lagerbestand. Die als Liste unter die Ware haengen.
Und auf Ware kannst du dannn zB ein property "lagerbestand" machen, das
einfach ueber die Variationen summiert.

Usw. Nix dict. Einfach

hose.variation[0].preis
hose.variation[0].farbe

Wenn du magst, kannst du natuerlich auf Ware __getitem__ so ueberladen, das
es wahlweise per integer oder per farbe indiziert, dann kannst du

hose['gruen'].preis

machen.

Diez

Ähnliche fragen