Eigentümliche Erstellung von Methoden...

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hab' mir gerade das Trac Mercurial Plugin angeschaut und bin über das hier gestolpert:

Code: Alles auswählen

class MercurialRepository(Repository):
    """Repository implementation based on the mercurial API.
    This wraps an hg.repository object.  The revision navigation
    follows the branches, and defaults to the first parent/child in
    case there are many.  The eventual other parents/children are
    listed as additional changeset properties.
    """
    def __init__(self, path, params, log, connector):
        self.ui = connector.ui
        self._show_rev = connector.show_rev
        self._node_fmt = connector.node_format
        # TODO 0.13: per repository ui and options
        # -- encoding
        encoding = connector.encoding
        if not encoding:
            encoding = ['utf-8']
        # verify given encodings
        for enc in encoding:
            try:
                u''.encode(enc)
            except LookupError, e:
                log.warning("'[hg] encoding' (%r) not valid", e)
        if 'latin1' not in encoding:
            encoding.append('latin1')
        self.encoding = encoding
        def to_u(s):
            if isinstance(s, unicode):
                return s
            for enc in encoding:
                try:
                    return unicode(s, enc)
                except UnicodeDecodeError:
                    pass
        def to_s(u):
            if isinstance(u, str):
                return u
            for enc in encoding:
                try:
                    return u.encode(enc)
                except UnicodeEncodeError:
                    pass
        self.to_u = to_u
        self.to_s = to_s

...
Welchen Grund könnte es geben, ``self.to_u`` und ``self.to_s`` auf diese Weise zu definieren?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Nun der Code wurde hinzugeführt in r10491 um Ticket 7160 zu lösen.

Es fehlt allerdings ein Kommentar der den Code erklärt. Die Commit Message erklärt es auch nicht, wo meiner Meinung nach auch gut hätte erklärt werden können. Es scheint kein Code Review gegeben zu haben.

Ich denke mal es gibt keinen Grund die Methoden so zu definieren und Entwicklungsprozess und Dokumentation könnten besser sein.

Darüberhinaus würde ich allerdings in Frage stellen ob diese Methoden in irgendeiner Form in der Klasse definiert werden sollten. In dem Code stecken ganz klar zwei Funktionen die danach schreien frei und wiederverwendbar zu werden.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

So schreibe ich Code, wenn ich etwas schnell hinklatschen muss. Die Vermutung liegt nahe, dass es in diesem Fall genau so gemacht wurde. Einen tieferen Sinn sehe ich darin auch nicht.
BlackJack

Der einzige semantische Unterschied den ich zu normalen Methoden erkennen kann, so wie man sie ”naiv” schreiben würde, ist das man so wie es jetzt gelöst ist `MercurialRepository.encoding` an einen neuen Wert binden kann, ohne dass das `to_s()` und `to_u()` beeinflusst. Die werden weiterhin auf den alten `encoding`-Daten operieren. Ob das jetzt aber die Intention war, oder gar ein Fehler ist…
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

... ließe sich nur sagen, wenn der Abschnitt entsprechen kommentiert worden wäre.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten