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.
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 )
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.
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.
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…