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

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

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.
Antworten