Verwendung eines Dekorators und eines Abschlusses
Der folgende Dekorator kann verwendet werden, um statische Funktionsvariablen zu erstellen. Er ersetzt die deklarierte Funktion durch die Rückgabe von sich selbst. Dies impliziert, dass die dekorierte Funktion eine Funktion zurückgeben muss.
def static_inner_self(func):
return func()
Dann verwenden Sie den Dekorator auf eine Funktion, die eine andere Funktion mit einer erfassten Variablen zurückgibt:
@static_inner_self
def foo():
counter = 0
def foo():
nonlocal counter
counter += 1
print(f"counter is {counter}")
return foo
nonlocal
erforderlich, andernfalls denkt Python, dass die counter
Variable ist eine lokale Variable und keine erfasste Variable. Python verhält sich so aufgrund der Variablenzuweisung counter += 1
. Jede Zuweisung in einer Funktion lässt Python glauben, dass die Variable lokal ist.
Wenn Sie der Variablen in der inneren Funktion nichts zuweisen, können Sie das Feld nonlocal
Anweisung, zum Beispiel, in dieser Funktion verwende ich, um Zeilen einer Zeichenkette einzurücken, wobei Python ableiten kann, dass die Variable nonlocal
:
@static_inner_self
def indent_lines():
import re
re_start_line = re.compile(r'^', flags=re.MULTILINE)
def indent_lines(text, indent=2):
return re_start_line.sub(" "*indent, text)
return indent_lines
P.S. Es gibt eine gelöschte Antwort, die das Gleiche vorschlägt. Ich weiß nicht, warum der Autor sie gelöscht hat. https://stackoverflow.com/a/23366737/195417
33 Stimmen
Es gibt NO Gleichwertigkeit, fürchte ich. Selbst wenn man den Decorator-Hack mit Funktionsattributen durchführt, kann man auf die Variable von außen zugreifen, was den Sinn der Sache leider zunichte macht. Außerdem müssen Sie den Funktionsnamen in der Funktion hart codieren, was sehr ärgerlich ist. Ich würde vorschlagen, stattdessen globale Variablen einer Klasse oder eines Moduls zu verwenden, mit der konventionellen
_
Vorwahl.17 Stimmen
Für Nicht-C-Programmierer, [ [stackoverflow.com/questions/5033627/](https://stackoverflow.com/questions/5033627/static-variable-inside-of-a-function-in-c#5033656](a "static variable inside of a function in c%235033656%5d(a") statische Variable innerhalb einer Funktion ist nur innerhalb des Funktionsbereichs dieser Funktion sichtbar, aber ihre Lebensdauer ist die gesamte Lebensdauer des Programms, und sie wird nur einmal initialisiert). Im Grunde genommen handelt es sich um einen dauerhaften Zähler oder eine Speichervariable, die zwischen Funktionsaufrufen lebt.
2 Stimmen
@lpapp: Irgendwie schon, es ist ein Klassenmitglied . Sie haben Recht, dass wir nicht verhindern können, dass andere Codes sie anzeigen oder ändern.
0 Stimmen
Ich fand respuesta gegeben von Claudiu nützlich.