Seite 1 von 1

Codestyle?

Verfasst: Dienstag 2. September 2008, 18:47
von Crazed
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

Verfasst: Dienstag 2. September 2008, 18:58
von Leonidas
Eine geringe Geschwindigkeit kann natürlich auch durch BeautifulSoup verursacht sein, siehe hier.

Verfasst: Dienstag 2. September 2008, 19:12
von EyDu
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.