Seite 1 von 1

Eigentümliche Erstellung von Methoden...

Verfasst: Mittwoch 20. Januar 2016, 23:42
von mutetella
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?

Re: Eigentümliche Erstellung von Methoden...

Verfasst: Mittwoch 20. Januar 2016, 23:57
von BlackJack
@mutetella: Gute Frage.

Re: Eigentümliche Erstellung von Methoden...

Verfasst: Donnerstag 21. Januar 2016, 00:19
von DasIch
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.

Re: Eigentümliche Erstellung von Methoden...

Verfasst: Donnerstag 21. Januar 2016, 08:13
von snafu
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.

Re: Eigentümliche Erstellung von Methoden...

Verfasst: Donnerstag 21. Januar 2016, 09:00
von 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…

Re: Eigentümliche Erstellung von Methoden...

Verfasst: Donnerstag 21. Januar 2016, 09:30
von bwbg
... ließe sich nur sagen, wenn der Abschnitt entsprechen kommentiert worden wäre.