Wie eigene Typen definieren?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Programmbeschreibung (Annahme; ich kenne MySpace nicht):

Deine Seite, welche du interpretierst bieten verschiedene Informationen an:

- Freund hat einen anderen Freund hinzugefügt
- Freund hat ein Foto verlinkt
- Stimmung eines Freundes
...

Das Programm soll die Seite abfragen und die einzelnen Informationen ausgeben.

----

Folgende Klassen können aus der Beschreibung herausgelesen werden:

* Information (als Basis für die folgenden drei Klassen)
* FriendAppend
* PhotoLink
* FriendMood

Allen Informationsarten ist gemein, dass sie auf einen bestimmten Freund angewendet werden. Der Freund (Name des Freundes) sollte daher bereits als Attribut in der Klasse 'Information' vorgehalten werden.

Die Spezialisierungen haben jeweils eigene Attribute.

Vereinfachte Darstellung der Klassen:

Code: Alles auswählen

class Information(object):
    def __init__(self, friend):
        self.friend = friend
        
    def __str__(self):
        return '<%s>' % (self.friend,)

class FriendAppend(Information):
    def __init__(self, friend, who):
        Information.__init__(self, friend)
        self.who = who

    def __str__(self):
        return '<%s> added %s as a friend' % (self.friend, self.who)

class PhotoLink(Information):
    def __init__(self, friend, url):
        Information.__init__(self, friend)
        self.url = url

    def __str__(self):
        return '<%s> was linked in this photo: %s' % (self.friend, self.url)

# ...
Innerhalb Deines DataGetter-Objektes fragst du nun alle Informationen ab und erzeugst die spezialisierten Informationsobjekte. Diese packst du in eine Liste.

Mit dieser Liste kannst du dann entsprechend weiterarbeiten. Wenn du nun die Informationen zu einem bestimmten Freund suchst, iterierst du einfach durch diese Liste (oder verwendest List-Comprehension) und fragst das Attribut 'name' ab. Du kannst dann aber auch ein Dictionary erzeugen usw.

Der DataGetter ist in diesem Fall verantwortlich für die Unterscheidung der einzelnen Arten.

Ich hoffe, das hilft, dir meine Gedankengänge zu dem Thema ein bisschen darzulegen.

Grüße... Heiko
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, ich übernehme überall die Original-Textstrings von der Myspace-Seite um zu gewährleisten, dass der Deutsche eine deutsche Ausgabe, der Spanier eine spanische Ausgabe usw hat, da ich annehme, dass die Myspace Seite in allen Sprachen gleich aufgebaut ist (müsste ich noch prüfen). Die Unterschiede sollen sein:

- prettify() <- Formatierung je nach Informationsart
- show_picture() <- wenn die Information Bilder beinhaltet, zum genauen Aufbau muss ich mir noch was überlegen

Und Informationen zu einem bestimmten Namen ermittle ich ja bereits mittels Dict. Schau dir mal get_dict() und get_data_by_name() an. ;)

Hier der derzeitige Code. get_updates() ist noch nicht verwendbar, da gerade erst angefangen.

http://paste.pocoo.org/show/85777/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ohne genau mitgelesen zu haben: MySpace hat doch eine API. Kannst du damit vielleicht besser arbeiten?


Und das hier

Code: Alles auswählen

def get_dict(data):
    keys = (elem[0] for elem in data)
    values = (elem[1:] for elem in data)
    return dict((key, value) for key, value in izip(keys, values))
lässt sich kompakt so schreiben:

Code: Alles auswählen

def get_dict(data):
    return dict((elem[0], elem[1:]) for elem in data)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Y0Gi hat geschrieben:Ohne genau mitgelesen zu haben: MySpace hat doch eine API. Kannst du damit vielleicht besser arbeiten?
Bisher habe ich es so verstanden, dass man damit Anwendungen in Myspace integrieren kann. Was ich will, ist ja eigentlich das genaue Gegenteil, nämlich Myspace insbesondere auf langsamen Rechnern nutzbar zu machen, indem ich es unabhängig vom Browser machee. Bei nem Kollegen baut sich die Seite bspw. extrem langsam auf, wegen den ganzen JavaScripts, blinkenden Werberfeldern usw. obwohl er im Prinzip nur mal schnell gucken will ob ein neuer Kommentar oder sowas da ist.

Und genau da soll mein Projekt eben ansetzen. Ich denke langfristig auch an so Scherze wie die Überprüfung auf neue Einträge in einem bestimmten Intervall und wenn was da ist, wird der User benachrichtigt oder eine Funktion, die alle neuen Benachrichtigungen seit dem letzten Login anzeigt. Zunächst einmal möchte ich aber die ganzen Arten von Benachrichtigungen implementiert kriegen und dann kann's weitergehen. ;)

Und zu get_dict: Die derzeitige Version sieht eh schon anders aus:

Code: Alles auswählen

    def get_dict(self):
        """Return a dictionary of given data, expects a list with tuples

        For each tuple: Return first element as key and a tuple of remaining 
        elements as value.

        Example:
        In: [('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')]
        Out: {'foo': ('bar', 'baz'), 'ham': ('egg', 'spam')}

        Intended to ease access on user related data.
        """
        dic = {}
        for elem in self.data:
            key = elem[0]
            if key in dic:
                msg = u'Renamed duplicate of key name "%s" to "%s_doublet"' \
                      % (key, key)
                warnings.warn(msg, category=DoubletKeyNameWarning)
                key = key + '_doublet'
            dic[key] = elem[1:]
        return dic 
Antworten