XML_Objects - Tester und Kritiker gesucht

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ich hab eine Frage oder vielleicht ist es ein Vorschlag.

Wenn ich einen Container hab kann ich ja mit .append() neue Elemente hinzufügen. Könnte man diesen Elementen nicht gleich einen Namen zuweisenen.


Also ich möchte in einem Container direkt die __slots__ variabeln speichern können, wie bei xml_attrs = {'name':int} in ein dict schreiben. Geht sowas schon oder kann man das hinzufügen? Beim Laden natürlich gleich wieder zuweisen.


Ich denke so könnte dein PyXO noch einfacher werden.

Code: Alles auswählen

class test(PyXO.Container):
    __slots__ = ['name','childs']
    xml_attrs = {'name':int}
    xml_container = ['childs']
childs ist bei mir jetzt wieder ein PyXO.Container.

Sowas in der Art, jetzt mach ich einfach in __init__ alle die ich drin haben möchte append(var)

Gruss
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rayo,

da muss man bei xml etwas vorsichtig sein, da ein Attrubut name oft synonym für eine ID eines Objektes steht. PyXO.Container hat z.B. schon ein Attribut "name". Wenn gewünscht oder erforderlich, wird auch ein verstecktes Attribut "id" an die Objekte in der XML-Datei vergeben. Du kannst dann in deinen Eigenen Containern, wenn jedes enthaltene Objekt ein name-attribut hat auch eine Methode "get_child_by_name(self, the_name)" erstellen:

Code: Alles auswählen

    def get_child_by_name(self, the_name):
        for child in self.children:
            if child.name == the_name:
                return child
        return None
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Danke für dein Weihnachtsgeschenk, Dookie!
Bin jetzt erst aus Mattighofen gekommen (wirst sicher kennen)
MfG
Andreas
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Hallo Dookie,
ich hab nochmal eine Frage.

Ich hab ein XML Element das beliebig viele Attribute in unterschiedlichen Kombination haben kann. Zur zeit 21 Stück die mir bekannt sind.
Das Problem ist jetzt, das jeder Autor diesem Element beliebig Attribute hinzufügen kann da die Spezifikation nicht genauer regelt welche Attribute das Element haben darf.

Zur Zeit regele ich das so, das ich jedes einzelne der mir bekannten Attribute in __slots__ und xml_attrs schreibe und in der Init Methode jedes Attribut abfrage und entferne um das zurückschreiben von nicht vorhandenen Attributen zu verhindern setzte ich diese dann auf None.

Das funktioniert zwar, ist aber unflexibel.
Ich weiss das __slots__verhindert das ich einfach so Attribute hinzufügen kann. Und genau das ist mein Problem?
Wie muss ein PyXO.Object ausschauen damit ich das umgehen kann?

MfG und danke
Andreas
Zuletzt geändert von XT@ngel am Freitag 14. Januar 2005, 19:12, insgesamt 1-mal geändert.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi XT@ngel,

hmm eigentlich müssen laut XML-Spezifikation die Attribute von Elementen schon bekannt sein, insbesondere wenn du eine DTD oder XMLScheme als Beschreibung des Formates definieren willst.

__slots__ ist seit dem letzten Update nur noch optional, also du musst __slots__ nicht mehr verwenden. Zum Schreiben von eigenen Attributen müsstest du, in einer von PyXO.Object abgeleiteten Klasse attrs_to_xml redefinieren.

Ich habe gerade eine neue Version von PyXO hochgeladen, welche auch unbekannte Attribute aus der XML-Datei lesen kann, dann wird als Typ automatisch str verwendet und ein Warning ausgegeben. Das Ausgeben des Warnings kannst Du über einen Filter in warnings bei Bedarf abschalten oder in eine Exception umleiten.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Danke,
hab nicht mitbekommen das es eine neue Version gibt. Da Du das am anfang immer in diesen Thread geschrieben hast.
Aber super, läuft jetzt einwandfrei.
eigentlich müssen laut XML-Spezifikation die Attribute von Elementen schon bekannt sein
Gut meine Darstellung war vieleicht schon etwas übertrieben.
Es geht um OPML.

In der DTD steht:

Code: Alles auswählen

text CDATA #IMPLIED
type CDATA #IMPLIED
isComment (true|false) false
isBreakpoint (true|false) false
%OtherAttributes;
:mrgreen:


Auf jedenfall Danke, funktioniert jetzt wie sein muss!

MfG
Andreas
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

So hab mal wieder ein Update gemacht, neben kleinen Codesäuberungen hab ich jetzt die Lizenz von "free" nach "Python license" geändert.
Hier nochmal der Link zu PyXO:
http://www.boa3d.de/python/modules/PyXO.php


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Damit PyXO nicht evtl. von der Bildfläche verschwindet, gab ich es inkl. readme in meinem SVN Server übernommen:

PyXO.py - Sourcecode | Revision Log | readme

Als erste aktion hab ich mal "cls" nach "self" umbenannt... Hatte mich ganz verwirrt, was "cls" bedeutet.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Als erste aktion hab ich mal "cls" nach "self" umbenannt... Hatte mich ganz verwirrt, was "cls" bedeutet.
cls ist die Namenskonvention, wenn man Metaclassen verwendet. Die Änderung würde ich rückgängig machen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dann muß ich wohl bisher nie über Metaclassen gestolpert sein. Denn cls hatte ich noch niergendwo gesehen:

Ich war ertmal nur verwirrt, was dieses cls ist und wo es her kommt. Erst als ich gesehen hab, das es in der Zeile, wo Methoden definiert werden, an der Stelle steht wo normalerweise self steht, ist mir ein Licht aufgegangen...

Ich find's aber als Erklärung zu wenig, warum man bei Metaclassen statt self cls nehmen sollte. Die Funktion ist doch die selbe, oder?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Jein. cls ist im Endeffekt wie selbst, nur macht man indem man cls nimmt noch mal explizit deutlich dass man es mit einem Klassen-Objekt (also einer Instanz des Typs type oder abgeleiteten Typs), und nicht mit einem Daten-Objekt (also einer Instanz des Typs object oder abgeleiteten Typs) zu tun hat.

Ich find die Konvention zwar in Metaklassen selbst auch unsinnig, da man mit dem self der Metaklasse spielt (bzw. die Methode eben das self der Metaklasse, was zwar ein Klassen-Objekt, aber eben eine Instanz der Klasse in der die Methode steckt ist), wo sie aber nicht unsinnig ist ist zum Beispiel bei __new__ einer Klasse, da man da wirklich das eigentliche Klassenobjekt bekommt.
--- Heiko.
Antworten