Also dachte ich, ich wäre klug und DRY durch Entfernen einer Reihe von gemeinsamen Code aus einer Reihe von ähnlichen Funktionen und verwandelt sie in Hilfsfunktionen alle an einem einzigen Ort definiert. (siehe GitHub diff) So können sie alle von einem einzigen Ort aus geändert werden. (Siehe another GitHub diff)Wie früh aus einer Hilfsfunktion zurückkehren?
So ursprünglich war es
func_A(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do A-specific stuff(things)
return late
func_b(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do B-specific stuff(things)
return late
und ich änderte es
_helper(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
return things
func_A(stuff):
things = _helper(stuff)
do A-specific stuff(things)
return late
func_B(stuff):
things = _helper(stuff)
do B-specific stuff(things)
return late
Aber dann habe ich versucht es und erkannte, dass da ich hatte die frühe Rückkehr bewegt („Wächter“ ?) in die Helferfunktion, sie funktionierten natürlich nicht mehr. Jetzt könnte ich den ursprünglichen Funktionen leicht Code hinzufügen, um mit diesen Fällen umzugehen, aber es scheint, dass es keine Möglichkeit gibt, das zu tun, ohne die Komplexität wieder in die einzelnen Funktionen zu verschieben und sich zu wiederholen.
Was ist die eleganteste Art, mit solchen Situationen umzugehen?
ohhh, ist das, was Dekoratoren sind? – endolith
[Verwenden von Python-Dekoratoren, um Wächter zu implementieren] (http://www.siddharta.me/2006/12/using-python-decorators-to-implement.html) – endolith
Ah, aber wenn die zu umbrechenden Funktionen unterschiedliche Anzahl von Argumenten annehmen , müssen Sie '* args' im Decorator verwenden, was dann zur Funktionssignatur wird, die hässlich ist. – endolith