Gibt es pythonic
Möglichkeiten, den Status zu erhalten (zum Beispiel für Optimierungszwecke), ohne vollständig objektorientiert zu werden?Wie man den Zustand in Python ohne Klassen erhält?
Auf meine Frage besser, hier ist ein Beispiel für ein Muster, das ich häufig verwenden in JavaScript illustrieren:
var someFunc = (function() {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
Äußerlich ist dies nur eine Funktion wie jede andere, ohne dass Gegenstände oder so etwas zu initialisieren, aber die Schließung erlaubt es, Werte einzeln zu berechnen, die ich dann im Wesentlichen als Konstanten benutze.
Ein Beispiel hierfür in Python ist beim Optimieren regulärer Ausdrücke - es ist nützlich zu verwenden re.compile
und gespeichert die kompilierte Version für match
und search
Operationen.
Die einzigen Möglichkeiten, die ich kenne, dies in Python zu tun, indem Sie eine Variable im Modulumfang einstellen:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
Oder durch Erstellen einer Klasse:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
Der frühere Ansatz ad -hoc und es ist nicht sehr klar, dass die Funktion und die oben deklarierte Variable miteinander verknüpft sind. Es sitzt auch verschmutzt den Namensraum des Moduls ein bisschen, mit dem ich nicht allzu glücklich bin.
Der letztere Ansatz scheint ausführlich und ein wenig schwer auf dem Boilerplate.
Der einzige andere Weg, den ich mir vorstellen kann, ist, alle Funktionen wie diese in separaten Dateien (Module) zu berücksichtigen und einfach die Funktionen zu importieren, so dass alles sauber ist.
Irgendwelche Ratschläge von erfahreneren Pythonern, wie man damit umgeht? Oder machen Sie sich einfach keine Sorgen und machen Sie weiter mit dem Problem?
Ich persönlich sehe kein Problem mit Ihrer Klassenerstellung. Ausführlichkeit ist gut. "Explizit ist besser als implizit." – tMC
Eine Möglichkeit, um zumindest die Verwendung dieser Klasse weniger ausführlich zu machen, wäre, "try_match" in "__call__" umzubenennen, wodurch Sie es (nach der Konstruktion) genau wie eine Funktion verwenden können. Aber wie in der Antwort von @glglgl, übersetzt sich Ihr JavaScript Code direkt in Python. – lvc
ist dieser Aufruf von someFunc in Ihrem ersten Beispiel korrekt? Oder sollte es Funktionsdefinition sein? – soulcheck