Es ist nicht sehr Pythonic, aber wenn Sie wirklich müssen:
import inspect
def compact(*names):
caller = inspect.stack()[1][0] # caller of compact()
vars = {}
for n in names:
if n in caller.f_locals:
vars[n] = caller.f_locals[n]
elif n in caller.f_globals:
vars[n] = caller.f_globals[n]
return vars
def extract(vars):
caller = inspect.stack()[1][0] # caller of extract()
for n, v in vars.items():
caller.f_locals[n] = v # NEVER DO THIS - not guaranteed to work
ich diese Implementierungen ziemlich viel gearbeitet haben, und sie arbeiten, aber technisch Das Ändern von f_locals
wird nicht unterstützt.
Im Ernst, wenn Sie wirklich das Gefühl haben, dass Sie diese Funktionen brauchen, tun Sie wahrscheinlich etwas falsch. Es scheint in mindestens drei Punkten gegen Python's philosophy zu laufen: "Explizit ist besser als Implizit", "Einfach ist besser als Komplex", "Wenn die Implementierung schwer zu erklären ist, ist es eine schlechte Idee", vielleicht mehr (und wirklich, wenn Sie haben genug Erfahrung in Python, Sie wissen, dass solche Sachen einfach nicht gemacht werden. Ich könnte sehen, dass es nützlich für einen Debugger oder Post-Mortem-Analyse, oder vielleicht für eine Art von sehr allgemeinen Framework, das häufig Variablen mit dynamisch gewählten Namen und Werten erstellen muss, aber es ist eine Strecke.
Wenn Sie diese Funktionen verwenden, sollten Sie zumindest die enthaltenen extract
Variablen in kleinen Bereichen halten. Wickeln Sie sie in Funktionen, die Sie dann als "Black Boxes" betrachten können. Der Hauptgrund, extract
ist schlecht ist, dass es Variablen in Ihre Symboltabelle in einer Weise platziert, die aus der Überprüfung des Codes nicht klar ist. Wenn Sie die Auswirkungen dieser Variablen auf eine sehr kleine Funktion beschränken und erklären, was Sie mit klarem Code und Kommentaren tun, ist das kein großes Problem.
Ok, ich denke ich sehe was mich verwirrte. Es sieht so aus, als ob Ihre Zeile 3 "$ a = kompakt ('foo', 'bar') sein sollte;" stattdessen. – pantsgolem
oops, danke. Ich habe es gerade korrigiert. – Turadg
Kann ich fragen, warum Sie sie praktisch finden? Ich sehe nicht, wofür sie gut sind, die mit hashtables nicht sauberer implementiert werden könnten. –