Funktionslokale Namensbindung von einem äußeren Bereich

Ich brauche eine Möglichkeit, Namen aus einem äußeren Codeblock in eine Funktion "einzufügen", damit auf sie lokal zugegriffen werden kannun Sie müssen nicht speziell vom Funktionscode behandelt werden (definiert als Funktionsparameter, geladen von*args etc.

Das vereinfachte Szenario: Bereitstellung eines Frameworks, in dem die Benutzer (mit möglichst geringer Syntax) benutzerdefinierte Funktionen definieren können, um andere Objekte des Frameworks (dienich Notwendigglobal).

Ideally definiert der Benutzer

def user_func():
    Mouse.eat(Cheese)
    if Cat.find(Mouse):
        Cat.happy += 1

HierCat, Mouse undCheese sind Framework-Objekte, die aus guten Gründen nicht an den globalen Namespace gebunden werden können.

Ich möchte einen Wrapper schreiben, damit sich diese Funktion wie folgt verhält:

def framework_wrap(user_func):
    # this is a framework internal and has name bindings to Cat, Mouse and Cheese
    def f():
        inject(user_func, {'Cat': Cat, 'Mouse': Mouse, 'Cheese': Cheese})
        user_func()
    return f

Dann kann dieser Wrapper auf alle benutzerdefinierten Funktionen angewendet werden (als Dekorator, vom Benutzer selbst oder automatisch, obwohl ich vorhabe, eine Metaklasse zu verwenden).

@framework_wrap
def user_func():

Ich kenne die Python 3'snonlocal Schlüsselwort, aber ich halte es immer noch für hässlich (aus der Sicht des Frameworks), eine zusätzliche Zeile hinzuzufügen:

nonlocal Cat, Mouse, Cheese

und sich Gedanken darüber zu machen, jedes Objekt, das er braucht, zu dieser Zeile hinzuzufügen.

Jeder Vorschlag wird sehr geschätzt.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage