Codestyle?

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.
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Codestyle?

Beitragvon Crazed » Dienstag 2. September 2008, 18:47

EDIT: Code hier: http://paste.pocoo.org/show/AnMQgW4hBs7WK2BZRYPP/

Hey, das ist mein Code. Es ist einfach nur ein Rewrite eines Moduls das ich schonmal geschrieben habe. Ein Modul um mit einer "TiddlyWiki" zu interagieren. Bis jetzt kann man mit diesem Modul nur auf alle Tiddler innerhalb einer TiddlyWiki zugreifen und dessen Attribute abfragen.

Da ich nicht so viel Zeit verschwenden beim Instanzieren der TiddlyWiki.Tiddler Klasse verschwenden wollte, wollte ich es "on-the-fly" machen. Das heißt die Attribute der TiddlyWiki werden erst gefüllt wenn sie gebraucht werden.

Nachdem sie das erste mal gefüllt worden sind werden die bereits vorhandenen Attribute immer so abgefangen:

Code: Alles auswählen

            if self._content:
                return self._content


damit es schneller läuft. Sie liegen also sozusagen direkt im "Cache". Es geht also mehre 100x male schneller nachdem man alle Attribute eines Tiddlers schon einmal abgefragt hat.

Meine alte Version (meiner Meinung nach sehr hässliche) des Modules könnt ihr hier finden:

http://paste.pocoo.org/show/xhnjI73e4aSFxMbp2mFV/

Was findet ihr besser? Was kann ich besser machen?

Ich hoffe mir kann jemand ein paar Ratschläge geben.

MfG,
CracKPod
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 2. September 2008, 18:58

Eine geringe Geschwindigkeit kann natürlich auch durch BeautifulSoup verursacht sein, siehe hier.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 2. September 2008, 19:12

Du solltest Dir das nächste mal Gedanken machen, wenn du Code einfach immer wieder kopierst ;-)

Code: Alles auswählen

import BeautifulSoup
import operator

def get_tiddler(self):
    return tiddler = self.tiddlywiki.find(TiddlyWiki.DIV, {TiddlyWiki.TITLE:self.title})

def get_creator(attribute):
    def get(self):
        if self.__dict__[attribute]:
            return self.__dict__[attribute]
           
        tiddler = get_tiddler(self)
        attrs = map(operator.itemgetter(0), tiddler.atts)
       
        if attribute in attrs:
            return tiddler[attribute]
        else:
            return None
   
    return get
   

def set_creator(attribute, funky=False):
    def set(self, value):
        tiddler = get_tiddler(self)

        if funky:
            tiddler[attribute] = value
        else:
            tiddler.pre.string.replaceWith(value)
       
        self.__dict__[attribute] = value
   
    return set


def property_creator(attribute):
    return property(get_creator(attribute),
                    set_creator(attribute))

class TiddlyWiki(object):
    TITLE = "title"
    DIV = "div"
   
    class Tiddler(object):
        def __init__(self, tiddlywiki, title):
            self.tiddlywiki = tiddlywiki
           
            self.title = title
            self.modifier = None
            self.created = None
            self.modified = None
            self.tags = None
            self.changecount = None
            self.content = None
       
        title = property_creator("title")
        modifier = property_creator("modifier")
        created = property_creator("created")
        modified = property_creator("modified")
        tags = property_creator("tags")
        changecount = property_creator("changecount")
        content = property_creator("content", True)

    def __init__(self, tiddlywiki):
        self.path = tiddlywiki
        self.source = open(tiddlywiki).read()
        self.soup = BeautifulSoup.BeautifulSoup(self.source)
       
    @property
    def tiddlers(self):
        tiddlers = {}
        for div in self.soup.find(TiddlyWiki.DIV, {'id':'storeArea'}).findAll(TiddlyWiki.DIV):
            d = div[TiddlyWiki.TITLE]
            tiddlers[d] = self.Tiddler(self.soup, d)
           
        return tiddlers


Ich habe jetzt nicht alle Konstanten ausgelagert und nicht alles zusammengefasst, aber da geht noch einiges.

Man könnte das ganze Erzeugen der Properties auch noch hübsch in eine Meta-Klasse packen.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], snafu